【问题标题】:how to use cursor.executemany with json data for oracle inserts如何将 cursor.executemany 与 json 数据一起用于 oracle 插入
【发布时间】:2022-01-06 14:10:51
【问题描述】:

在我的 python 脚本中使用游标执行将行插入到 oracle 表中需要很多时间。将自动提交设置为 false 但仍然相同。尝试 executemany 没有运气,因为它会引发错误。以下是我的代码:

insert_statement='INSERT INTO mytable
VALUES (:1,:2)
'
r = requests.get(url,cert=(auth_certificate,priv_key),verify=root_cert, timeout=3600, stream=True)

data=json.loads(r.text)

for item in data:
    try:
        id=(item.Get('data').get("test").get("id"))
    except Attribute Error:
        id=''
    try:
        name=(item.Get('data').get("name"))
    except Attribute Error:
        name=''
    rows=(id,name)
    cursor.Executemany(insert_statement,rows)
    connection_target.commit()

这会引发错误:TypeError:参数应该是序列/字典列表或指定执行语句次数的整数

您能否建议如何正确使用带有 json 数据的 executemany ?

这里是示例 json 数据:

json_data=[{
  "publishTime" : "2021-05-29T12:52:15.129Z",
  "data" : {
    "identifier" : {
      "domain" : "AB",
      "id" : "1771374",
      "version" : "58593668"
    },
    "Accounts" : [
      {
        "effectiveEndDate" : "3000-01-01T00:00:00Z",
        "Name" : "w (S)",
        "effectiveStartDate" : "2016-09-16T04:21:33Z",
        "sAccount" : "SGLDPB_A"
      }
    ]
  }
}]

【问题讨论】:

  • 您的插入语句有 20 列,但您的 rows=(id,name) 只有 2 列。您要插入多少列?您能否编辑您的问题以添加有关您的表和 JSON 结构的一些详细信息?
  • 对不起,我复制了错误的插入语句。现在只有2行,但以后会有很多。我添加了相同的 json 数据输入。只想知道executemany的正确使用方法
  • 您将一行传递给executemany。这不是它的工作原理。您的for 循环应该建立一个列表,其中每个元素是您要插入的一行。然后,在循环结束后,您调用 executemany 并传递您的行列表。

标签: python json oracle


【解决方案1】:

您需要收集行列表,然后在循环完成后将该列表传递给executemany。并注意你的大小写。另外,您代码中的名称与示例 JSON 中的名称不匹配。

请注意,我已将其修改为一次执行 1,000 行。

insert_statement='INSERT INTO mytable VALUES (:1,:2)'
r = requests.get(url,cert=(auth_certificate,priv_key),verify=root_cert, timeout=3600, stream=True)

data=json.loads(r.text)

myrows = []
for item in data:
    try:
        id=item['data']["identifier"]["id"]
    except AttributeError:
        id=''
    try:
        name=item['Accounts'][0]['Name']
    except AttributeError:
        name=''
    myrows.append( (id, name) )
    if len(myrows) >= 1000:
        cursor.executemany(insert_statement,myrows)
        myrows = []

cursor.executemany(insert_statement,myrows)
connection_target.commit()

【讨论】:

  • 谢谢蒂姆。抱歉,python 和学习新手。以上至少没有给我任何错误。它运行但似乎卡在 executemany step 上。表没有问题,因为我可以将数据单独插入其中。你有什么建议吗?
  • 您要添加多少行?我相信有更好的方法可以批量插入 Oracle 数据库。
  • 大约有 100k 行。执行批量插入的有效方法是什么?
  • 我错了,executemany 是首选方法。它进行一次网络往返。除非您的网络是 1995 年的,否则我预计这将花费不到 10 秒的时间。
  • 谢谢蒂姆。 30 分钟后,出现“cx_Oracle.DatabaseError:ORA-01653:无法在表空间 DATA 中将表 mytable 扩展为 8192。延长的执行时间可能是因为表空间吗?
猜你喜欢
  • 2020-08-18
  • 2020-09-11
  • 2021-07-29
  • 2022-07-30
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
相关资源
最近更新 更多