【问题标题】:Using executemany() with PYPYODBC将 executemany() 与 PYPYODBC 一起使用
【发布时间】:2019-08-25 13:48:16
【问题描述】:

我的项目目前正在使用pypyodbc Python 库连接到 DB2 数据库,我的源是 MS SQL 服务器,我需要从中读取数据并将数据加载到 DB2 表中。数据量为百万行,我正在尝试使用executemany() 方法在一次执行中加载 50 条记录,但我不断收到错误:

数据必须在列表、元组或行中

我确实使用list 函数对我的光标结果进行类型转换,但它仍然不起作用。结果集中的数据格式为[(record1),(record2)]。代码sn-p如下:

也尝试过对 sql 结果集元组进行类型转换

# use pypyodbc to establish a connection - db2_conn. 
cur = db2_conn.cursor()
cur.execute('...a query with 10 columns...')
result = cur.fetchmany(50)

insert_query = 'insert into db2_table (col1,col2,col3,...) values (?,?,?,..)'
cur.executemany(insert_query, list(result))
cur.commit()

【问题讨论】:

  • MS SQL 游标在哪里?这看起来只在 DB2 连接上运行查询。 still doesn't work 是否意味着在 results 上有或没有 list() 的完全相同的错误?
  • --ms sql server 连接 sql_conn = pyodbc.connect("DRIVER="+src_driver+";SERVER="+src_server+";DATABASE="+src_database+";UID="+src_username+";PWD ="+ src_password) --db2 连接 db2_conn = pypyodbc.connect(driver=tgt_driver, system=tgt_system, uid=tgt_username, pwd=tgt_password)
  • 请用代码编辑帖子(不在 cmets 中)并展示它如何集成到上述代码块中。根据需要进行编辑。我必须修复很多无法在 Python 中运行的问题。然后回来删除上面难以阅读的评论,我也会。

标签: python parameters db2 odbc pypyodbc


【解决方案1】:

代码看起来不错 - 请发布失败的确切代码。 我使用 Db2 作为源和目标测试了以下内容:

  1. 已创建源表和目标表
db2 "create table odbc_test(c1 int, c2 varchar(10))"
db2 "create table odbc_test_sorurce(c1 int, c2 varchar(10))"
  1. 使用数据填充源
db2 "insert into odbc_test_sorurce 
    with
       cte(c1)
    as
       (select
            1
        from
           sysibm.sysdummy1
        union all
        select
           c1 + 1
        from
           cte
        where c1 < 1000) select  c1, 'row' || c1 from cte"
  1. 已连接到数据库并获取行
import pyodbc
cnx = pyodbc.connect("DRIVER={DB2};HOSTNAME=localhost;DATABASE=sample;UID=xxxx;PWD=xxxxx;PROTOCOL=TCPIP;PORT=60115")
cnx.autocommit = False
cur = cnx.cursor()
cur.execute('select c1, c2 from odbc_test_sorurce')
result = cur.fetchmany(50)
  1. 这给了我一个列表作为结果:
In [16]: result
Out[16]: 
[(1, 'row1'),
 (2, 'row2'),
 (3, 'row3'),
 (4, 'row4'),
 (5, 'row5'),
 (6, 'row6'),
 (7, 'row7'),
...


In [17]: type(result)
Out[17]: list
  1. 插入效果很好:
cur.executemany("insert into odbc_test(c1, c2) values (?,?)", result)
cnx.commit()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-24
    • 2011-10-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    相关资源
    最近更新 更多