【问题标题】:Error when using Pandas to write SQL to Oracle: TypeError: expecting string, unicode or buffer object使用 Pandas 向 Oracle 写入 SQL 时出错:TypeError: Expecting string, unicode or buffer object
【发布时间】:2015-04-16 13:00:19
【问题描述】:

使用 Pandas 将 SQL 写入 Oracle 时出错:TypeError: Expecting string, unicode or buffer object while trying to use:

熊猫 v 0.15.2

SqlAlchemy v 0.9.8

merged.to_sql('name_of_table', ora, schema='schema', if_exists='append', index=False)

这是我的引擎创建字符串:

ora = create_engine('oracle://name:pass@site.domain.com:1521/instance')

我在here on the site 之前遇到过问题,但在 Joris 的帮助下已解决。更正后它工作了一次,然后开始提示上面的错误。

我尝试过this issueand this one,但无济于事。

这是完整的错误:

merged.to_sql('name_of_table', ora, schema='schema', if_exists='append', index=False)Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/pandas/core/generic.py", line 966, in to_sql
dtype=dtype)
File "/usr/local/lib/python2.7/dist-packages/pandas/io/sql.py", line 538, in to_sql
chunksize=chunksize, dtype=dtype)
File "/usr/local/lib/python2.7/dist-packages/pandas/io/sql.py", line 1172, in to_sql
table.insert(chunksize)
File "/usr/local/lib/python2.7/dist-packages/pandas/io/sql.py", line 717, in insert
self._execute_insert(conn, keys, chunk_iter)
File "/usr/local/lib/python2.7/dist-packages/pandas/io/sql.py", line 692, in _execute_insert
conn.execute(self.insert_statement(), data)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 729, in execute
return meth(self, multiparams, params)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/elements.py", line 322, in _execute_on_connection
return connection._execute_clauseelement(self, multiparams, params)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 826, in _execute_clauseelement
compiled_sql, distilled_params
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 958, in _execute_context
context)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1162, in _handle_dbapi_exception
util.reraise(*exc_info)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 928, in _execute_context
context)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/dialects/oracle/cx_oracle.py", line 941, in do_executemany
cursor.executemany(statement, parameters)
TypeError: expecting string, unicode or buffer object

有趣的是,如果我将其写入 csv,然后将 csv 读回新的数据帧,它将开始将其写入 Oracle。

例子:

merged.to_csv('name.csv', sep=',', index=False, dtype=object)
merged1 = pd.read_csv('name.csv', dtype=object)

然后它会更进一步,但是弹出一个新的错误: sqlalchemy.exc.DatabaseError: (DatabaseError) ORA-00932: 不一致的数据类型: 预期 NUMBER 得到 CLOB

感谢任何帮助。谢谢!

【问题讨论】:

  • 你能显示merged.info()merged1.info()的输出吗?此外,你有 NaN 值吗?如果您只尝试附加数据帧的第一行(merged.head().to_sql(...)),您是否有同样的问题?您还可以尝试将echo=True 传递给create_engine 以获得更详细的输出结果。
  • @Joris,对于这方面的长期延迟感到抱歉,但我想通了。稍后我会在这里发布我自己问题的答案。
  • 当然发布您自己的答案,我对解决方案感兴趣!

标签: python oracle pandas


【解决方案1】:

回答我自己的问题,尽管有点晚了。这围绕数据库和数据框之间的数据类型问题展开。将数据框解析为与表相似的 dtype 使其能够成功写入。

再次感谢@Joris

【讨论】:

    猜你喜欢
    • 2015-03-21
    • 2021-08-05
    • 2021-10-10
    • 1970-01-01
    • 2015-08-20
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    相关资源
    最近更新 更多