首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >df.to_sql与AS400

df.to_sql与AS400
EN

Stack Overflow用户
提问于 2022-08-04 19:38:43
回答 1查看 91关注 0票数 1

我想把放到IBM系列/ AS400上。我已经研究了很多,但现在我被困住了。我已经做了很多查询,在这里我使用pyodbc。对于df.to_sql(),我应该使用sqlalchemy和ibm_db_sa方言,就像在其他堆栈上读取的那样。

我的实际代码是:

代码语言:javascript
运行
复制
    CONNECTION_STRING = (
        "driver={iSeries Access ODBC Driver};"
        "System=111.111.111.111;"
        "database=TESTDB;"
        "uid=USER;"
        "pwd=PASSW;"
    )


    quoted = urllib.parse.quote_plus(CONNECTION_STRING)
    engine = create_engine('ibm_db_sa+pyodbc:///?odbc_connect={}'.format(quoted))


    create_statement = df.to_sql("TABLETEST", engine, if_exists="append")

已安装下列软件包

代码语言:javascript
运行
复制
python 3.9
ibm-db 3.1.3
ibm-db-sa 0.3.7
ibm-db-sa-py3 0.3.1.post1
pandas 1.3.5
pip 22.0.4
setuptools 57.0.0
SQLAlchemy 1.4.39

当我运行时,我会得到以下错误:

代码语言:javascript
运行
复制
sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42S02', '[42S02] [IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL0204 - COLUMNS in SYSCAT type *FILE not found. (-204) (SQLPrepare)')
[SQL: SELECT "SYSCAT"."COLUMNS"."COLNAME", "SYSCAT"."COLUMNS"."TYPENAME", "SYSCAT"."COLUMNS"."DEFAULT", "SYSCAT"."COLUMNS"."NULLS", "SYSCAT"."COLUMNS"."LENGTH", "SYSCAT"."COLUMNS"."SCALE", "SYSCAT"."COLUMNS"."IDENTITY", "SYSCAT"."COLUMNS"."GENERATED" 
FROM "SYSCAT"."COLUMNS" 
WHERE "SYSCAT"."COLUMNS"."TABSCHEMA" = ? AND "SYSCAT"."COLUMNS"."TABNAME" = ? ORDER BY "SYSCAT"."COLUMNS"."COLNO"]
[parameters: ('USER', 'TABLETEST')]
(Background on this error at: https://sqlalche.me/e/14/f405)

我认为,方言可能是错误的,因为参数是用户名和ODBC连接的表?

我不太确定,ibm_db_sa和ibm_db有什么区别?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-08 19:01:18

我又试了几天,在有人试图通过sqlalchemy做这件事之前,应该通过pyodbc来做。

下面是我的工作示例,将df_to_sql_bulk_insert函数引用到this (现在我正在使用system):

代码语言:javascript
运行
复制
  def df_to_sql_bulk_insert(df: pd.DataFrame, table: str, **kwargs) -> str:
      df = df.copy().assign(**kwargs)
      columns = ", ".join(df.columns)
      tuples = map(str, df.itertuples(index=False, name=None))
      values = re.sub(r"(?<=\W)(nan|None)(?=\W)", "NULL", (",\n" + " " * 7).join(tuples))
      return f"INSERT INTO {table} ({columns})\nVALUES {values}"


  cnxn = pyodbc.connect("DSN=XXX")
  cursor = cnxn.cursor()
  sqlstr = df_to_sql_bulk_insert(df,"DBXXX.TBLXXX")
  cursor.execute(sqlstr)
  cnxn.commit()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73241444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档