提问人:j stevenage 提问时间:11/17/2023 最后编辑:Adrian Klaverj stevenage 更新时间:11/18/2023 访问量:60
SQLalchemy抛出数据转换错误,而pgadmin没有问题?
SQLalchemy throwing a data conversion error whereas pgadmin has no trouble?
问:
我最初在 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文件中的多个语句。
答: 暂无答案
评论