SQLalchemy抛出数据转换错误,而pgadmin没有问题?

SQLalchemy throwing a data conversion error whereas pgadmin has no trouble?

提问人:j stevenage 提问时间:11/17/2023 最后编辑:Adrian Klaverj stevenage 更新时间:11/18/2023 访问量:60

问:

我最初在 PGadmin4 中更改了我的表,只是在我想要的地方进行了一些代码重构,而不是在 sqltools 上运行我的 select 语句,而是通过 sqlalchemy 来完成。

我遇到的主要问题是,我认为它不会运行多个语句。因此,我没有将一个文件与我的产品表一起使用,而是将其拆分为两个单独的文件。

文件 00 :

ALTER TABLE public.dim_products
ADD COLUMN weight_class varchar(20);

UPDATE public.dim_products
SET removed =
CASE
    WHEN removed = 'Removed' THEN FALSE
        WHEN removed = 'Still_avaliable' THEN TRUE
END,
product_price = REPLACE(product_price, '£', ''),
weight = REPLACE(weight, 'kg', '');

ALTER TABLE public.dim_products
RENAME COLUMN removed to still_available;`

UPDATE public.dim_products
SET weight_class =
CASE
    WHEN weight::float < 2 THEN 'Light'
    WHEN weight::float >= 2 AND weight::float < 41 THEN 'Mid_Sized'
    WHEN weight::float >= 41 AND weight::float < 141 THEN 'HEAVY'WHEN weight::float >= 141 THEN 'Truck_Required'
END;

ALTER TABLE public.dim_products
RENAME COLUMN product_price to product_price_in_£;

ALTER TABLE public.dim_products
RENAME COLUMN weight to weight_in_kg;

文件 01 将是:

ALTER TABLE public.dim_productsALTER COLUMN product_price_in_£ TYPE FLOAT USING product_price_in_£::float,ALTER COLUMN weight_in_kg TYPE FLOAT USING weight_in_kg::float,
ALTER COLUMN "EAN" TYPE VARCHAR(14) USING "EAN"::varchar(14),
ALTER COLUMN product_code TYPE VARCHAR(14) USING product_code::varchar(14),
ALTER COLUMN date_added TYPE DATE USING date_added::date,
ALTER COLUMN uuid TYPE UUID USING uuid::uuid,
ALTER COLUMN still_available TYPE BOOL using still_available::bool,
ALTER COLUMN weight_class TYPE VARCHAR(20) USING weight_class::varchar(20),
ADD PRIMARY KEY (product_code);`

但是,我在sqlalchemy上不断遇到的错误是

`sqlalchemy.exc.DataError: (psycopg2.errors.InvalidTextRepresentation) invalid input syntax for type double precision: "£3.00"`

所以从本质上讲,我的想法是它跳过了上述一些语句,因为如果我在 pgadmin4 中运行这个巨大的脚本,它会毫无问题地运行,所以它肯定会跳过替换功能。根据我在以前的帖子中读到的内容,我选择使用连接器的 begin() 方法,因为它建立了数据库连接并处理了那些更改结构的语句,因此尝试将该文件一分为二,第一部分设置结构,第二部分更改列类型,但我仍然收到相同的数据错误。所以基本上我被难住了

这是我的主要方法:

def main():
 #bunch of tables i'm initialising from scraping data from various places
    user_table_init()
    card_details_table_init()
    store_details_init()
    datetime_table_init()
    product_details_init()
    order_table_init()
    
    database_engine = database_utils.create_engine('postgresql://postgres:USERNAME@localhost:5432/Sale_Data')
    
with database_engine.begin() as con:
        for file in os.listdir('Database-structure'): #directory with all my sql files
            if file.endswith(".sql"):
                with open(os.path.join('Database-structure', file)) as alter_statements_sql:
                    query = text(alter_statements_sql.read()) #some files have multiple statements
                    
                    print(file)
                    con.execute(query) #read somewhere i can use Multi set that to true for multistatements except i think thats a function on mysql and not postgres
                    print('done')
                    
                    
        for file in os.listdir('Database-structure\Database-schema'):
            if file.endswith(".sql"):
                with open(os.path.join('Database-structure\Database-schema', file)) as relationships_statements_sql:
                    query = text(relationships_statements_sql.read())
                    con.execute(query)

摘要:在PGAdmin上运行相同的语句时没有问题,但是在sqlalchemy上运行时,存在数据转换问题,根据我的理解,可以归结为Postgres SQLAlchemy不允许运行一个sql文件中的多个语句。

蟒蛇 PostgreSQL SQL炼金术 psycopg2

评论

0赞 snakecharmerb 11/17/2023
我尝试了一对类似的脚本,但没有重现错误:所有语句都已执行。
0赞 j stevenage 11/17/2023
@snakecharmerb是的,它似乎工作得很好,但是当拥有文件并尝试使用sqlalchemy连接对象对其进行删除时。它提出了该错误消息,它向我表明 sqlalchemy 不允许具有多个语句的 sql 文件,并且每个文件只包含一个语句。因为当它读取文件 0 时,它不包括用空格替换 £,因为稍后会出现数据错误警告。所以我认为如果我想使用 sqlalchemy 重现,我需要将语句拆分为单独的文件
0赞 j stevenage 11/17/2023
@snakecharmerb这很奇怪,我可以问一下与我的实现相比,您是如何运行它的,我将编辑我的问题以包含它
0赞 j stevenage 11/17/2023
@snakecharmerb注意到我已经在那里有了主系统,与我的实现相比,您所做的实现是否不同?
0赞 snakecharmerb 11/17/2023
pastebin.com/a9dhiV8e

答: 暂无答案