繁体   English   中英

使用cx_Oracle executemany()从Python列表/字典批量插入Oracle数据库

[英]Bulk insert from Python list/dict to Oracle Database using cx_Oracle executemany()

我正在将数据从Python字典插入Oracle DB。 我使用了游标类中的executemany()。 我收到以下错误:

ORA-01036:非法的变量名称/编号

此外,当我对executemany()使用try / except时,还会收到其他错误:

cx_Oracle.DatabaseError:DPI-1010:未连接

环境:Python:3.6.7,Oracle:12c,cx_Oracle:7.1.2,OS:Ubuntu

我将Dictionary数据转换为Dictionary的列表,并将其作为executemany()的第二个参数传递,但是得到了相同的错误。 这是我的词典列表的样子

    [{'location': 1, 'xxx_id': 917985, 'seq': 758, 'event_time': 
    datetime.datetime(2019, 5, 5, 20, 1, 53), 'event_type': 'xxxx', 'number': 
    123, 'stop': '40305', 'x': None, 'y': None, 'arrival_time': 
    datetime.datetime(2019, 5, 5, 20, 1, 33), 'departure_time': 
    datetime.datetime(2019, 5, 5, 20, 2), 'yyy_id': 529934, 'zzz_id': 59359277}, 
   {'location': 1, 'xxx_id': 917985, 'seq': 759, 'event_time': 
   datetime.datetime(2019, 5, 5, 20, 2, 33), 'event_type': 'xxxx', 'number': 
   123, 'stop': '40301', 'x': None, 'y': None, 'arrival_time': 
   datetime.datetime(2019, 5, 5, 20, 2, 27), 'departure_time': 
   datetime.datetime(2019, 5, 5, 20, 2, 50), 'yyy_id': 529930, 'zzz_id': 59279},

   {.......},
   {.......}
   ]

尝试了来自stackoverflow的其他建议,但是没有运气。 最接近我的情况是这种情况。 使用python将字典列表插入SQL表

这是我尝试过的代码

    sql_insert = '''INSERT INTO TABLE_NAME (LOCATION, XXX_ID, SEQ, 
    EVENT_TIME, EVENT_TYPE, NUMBER, STOP, X, Y, ARRIVAL_TIME, DEPARTURE_TIME, 
    YYY_ID, ZZZ_ID)
    VALUES(:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13)'''

    for k1, v1 in events.items():
        list_events = []
        for k2, v2 in v1.items():
            x = dict(v2)
            # print(x)
            list_events.append(x)
            cursor = connection.cursor()
        try:
            cursor.executemany(sql_insert, list_events)
            connection.commit()
        except cx_Oracle.DatabaseError as e:
            print(e)

我正在尝试插入几千条记录。 任何帮助都是非常可观的。

我的一位同事建议使用命名的(例如values(:location,:peggo_id,....)占位符,而不是编号的占位符,并且它与命名占位符一起使用。尽管我不确定这是Oracle还是cx_Oracle。另外,如果要在executemany()方法中传递字典,则命名参数必须与字典中的键名完全相同。

请参见Python cx_Oracle中的高效且可伸缩的批处理语句执行

您想要类似的东西:

data = [
    (60, "Parent 60"),
    (70, "Parent 70"),
    (80, "Parent 80"),
    (90, "Parent 90"),
    (100, "Parent 100")
]

cursor.executemany("""
        insert into ParentTable (ParentId, Description)
        values (:1, :2)""", data)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM