【发布时间】: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 issue、and 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,对于这方面的长期延迟感到抱歉,但我想通了。稍后我会在这里发布我自己问题的答案。
-
当然发布您自己的答案,我对解决方案感兴趣!