Python / psycopg处理2中优美主键错误
技术问答
243 人阅读
|
0 人回复
|
2023-09-14
|
使用Python 2.7和& U4 x7 n# }, r5 U: M
在[150]中:psycopg2。版本 Out [150].4.2(dt dec pq3 ext)”- E( a1 g0 X$ z" T, z) I0 X
我有一个简单的python脚本用于处理事务,并将数据写入数据库。有时有一个插入违反我的主键。好吧,我只希望它忽略记录,继续愉快地进行。我遇到的问题是psycopg主键错误正在暂停整个事务块,所有插入在错误失败后。这是一个例子错误
( l1 s3 \! K9 w- R- vERROR: duplicate key value violates unique constraint "encounter_id_pkey"DETAIL: Key (encounter_id)=(9012235) already exists.这是下一个插入。不违反。
3 h; _2 N, a0 u* p2 Y+ i. fInserting: 0163168~9024065ERROR: current transaction is aborted,commands ignored until end of transaction block每个插入都会重复第二个错误。这是一个简化的循环。我正在经历熊猫数据框,但可能是任何循环。
0 U5 L# b; j% P7 y iconn = psycopg2.connect("dbname='XXXX' user='XXXXX' host='XXXX' password='XXXXX'")cur = conn.cursor()for i,val in df2.iteritems(): try: cur = conn.cursor() cur.execute("""insert into encounter_id_table ( encounter_id,current_date values (create_date)s,%(encounter_id)s ) ;""", encounter_id':i.split('~')[1], create_date': datetime.date.today())) cur.commit() cur.close() except Exception ,e: print 'ERROR:',e[0] cur.close() conn.close()同样,基本的想法是妥善处理错误。在皇家海军纳尔逊海军将军的格言中:该死的演习直接针对他们。我认为该死的错误指向他们。我想通过在每个插入上打开一个游标,我将重置事务块。我不想因为关键错误而重置连接。我只是想念什么?
5 y. q! H+ _% }! z6 t3 M5 {感谢您宝贵的时光。, ^. U' z/ r0 y/ S: b$ ?; G: X6 ^" k
1 K; K9 g4 @3 v0 l3 I/ M2 S
解决方案: 8 |, J1 R. C. T) T3 t
发生错误时应回滚。
7 g% L3 l- O( u7 K( g我try..except..else另一种结构添加到下面的代码中,以显示异常的确切位置。0 p; X) j! }& _! C( s
try: cur = conn.cursor() try: cur.execute("""insert into encounter_id_table ( encounter_id,current_date values (create_date)s,%(encounter_id)s ) ;""", encounter_id':i.split('~')[1], create_date': datetime.date.today except psycopg2.IntegrityError: conn.rollback() else: conn.commit() cur.close() except Exception ,e: print 'ERROR:',e[0] |
|
|
|
|
|