我正在尝试在 postgres sql 数据库中插入超过 10K 条记录,并使用 SQL Alchemy 批量插入功能(使用 insert 语句)。
insert_stmt = (
insert(table)
.values(records)
.returning(getattr(table, primary_key))
)
其中 table 是表名,records 是字典列表。
虽然它非常适合 happycases,但如果数千条记录之一出现错误情况,它会记录整个 sql 语句,并用该语句淹没整个终端。看起来像这样
sqlalchemy.exc.DataError:(psycopg2.errors.InvalidTextRepresentation)整数类型的输入语法无效:“abc” 第 1 行: ...user', '2024-05-11T19:48:10.8932'::timestamp), ('abc', 'jo... ^
[SQL: INSERT INTO emp (user_id,first_name,last_name,created_by,create_time) VALUES (%(location_number_m0)s, %(user_id_m0)s, %(role_title_m0)s, %(first_name_m0)s, %(last_name_m0)s, %(created_by_m0)s, %(create_time_m0)s), (%(location_number_m1)s, %(user_id_m1)s, %(role_title_m1)s, %(first_name_m1)s, %(last_name_m1)s, %(created_by_m1)s, %(create_time_m1)s)、(%(location_number_m2)s、%(user_id_m2)s、%(role_title_m2)s、%(first_name_m2)s、%(last_name_m2)s、%(created_by_m2)s、%(create_time_m2)s) , (%(location_number_m3)s, %(user_id_m3)s, %(role_title_m3)s, %(first_name_m3)s, %(last_name_m3)s, %(created_by_m3)s, %(create_time_m3)s), (%(location_number_m4) s、%(user_id_m4)s、%(role_title_m4)s、%(first_name_m4)s、%(last_name_m4)s、%(created_by_m4)s、%(create_time_m4)s)、(%(location_number_m5)s、%(user_id_m5) s、%(role_title_m5)s、%(first_name_m5)s、%(last_name_m5)s、%(created_by_m5)s、%(create_time_m5)s)、(%(location_number_m6)s、%(user_id_m6)s、%(role_title_m6) s、%(first_name_m6)s、%(last_name_m6)s、%(created_by_m6)s、%(create_time_m6)s)、(%(location_number_m7)s、%(user_id_m7)s、%(role_title_m7)s、%(first_name_m7) s、%(last_name_m7)s、%(created_by_m7)s、%(create_time_m7)s)、(%(location_number_m8)s、%(user_id_m8)s、%(role_title_m8)s、%(first_name_m8)s、%(last_name_m8) s, %(created_by_m8)s, %(create_time_m8)s)]
我怎样才能摆脱这个语句,很难导航到巨大的sql语句之上的根本原因。
我尝试在创建引擎时使用 echo=False、echo_pool=False 禁用日志。但它不起作用。
我也尝试将级别设置为“信息”、“错误”、“调试”,但效果不佳
还有什么方法可以只打印错误行而不是整个 insert into 语句?
更新 - 我使用了其他方式来执行插入许多语句,如 SQLAlchemy2.0 中所述,它使用 session.execute(insert(table),records), 使用此功能可以在内部隐藏语句并提及隐藏的字符数。