回答

收藏

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]
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则