Python 将DataFrame从Pandas加载到ORACLE的SQL会产生错误-ORA-00911:无效字符

Python 将DataFrame从Pandas加载到ORACLE的SQL会产生错误-ORA-00911:无效字符,python,oracle,pandas,Python,Oracle,Pandas,我正在尝试将数据帧从Pandas加载到Oracle。我可以很好地阅读sql,但是df.to_sql不起作用 以下是错误: Error on sql SELECT name FROM sqlite_master WHERE type='table' AND name='table_name_here'; Traceback (most recent call last): File " <stdin>", line 1, in <module> File "/u

我正在尝试将数据帧从Pandas加载到Oracle。我可以很好地阅读sql,但是df.to_sql不起作用

以下是错误:

Error on sql SELECT name FROM sqlite_master WHERE type='table' AND name='table_name_here'; Traceback (most recent call last): File "
<stdin>", line 1, in
  <module>
    File "/usr/lib/python2.7/dist-packages/pandas/core/frame.py", line 1261, in to_sql self, name, con, flavor=flavor, if_exists=if_exists, **kwargs) File "/usr/lib/python2.7/dist-packages/pandas/io/sql.py", line 207, in write_frame exists = table_exists(name,
    con, flavor) File "/usr/lib/python2.7/dist-packages/pandas/io/sql.py", line 275, in table_exists return len(tquery(query, con)) > 0 File "/usr/lib/python2.7/dist-packages/pandas/io/sql.py", line 90, in tquery cur = execute(sql, con, cur=cur) File
    "/usr/lib/python2.7/dist-packages/pandas/io/sql.py", line 47, in execute cur.execute(sql) cx_Oracle.DatabaseError: ORA-00911: invalid character
我还尝试添加如下模式:

import pandas as pd
from sqlalchemy import create_engine
import cx_Oracle

engine = create_engine('oracle://name:pass@server.domain.com:port/sid')
cnx = engine.raw_connection()

merged = pd.DataFrame.from_csv('name.csv', sep=',', index_col=False)
merged.to_sql('table_name_here', cnx, schema='name', if_exists='append')
根据Joris的说法,我试过:

>>> merged.to_sql('name_of_table', engine, schema='XXCOST', if_exists='append')
Error on sql SELECT name FROM sqlite_master WHERE type='table' AND  name='name_of_table';
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/pandas/core/frame.py", line 1261,  in to_sql
self, name, con, flavor=flavor, if_exists=if_exists, **kwargs)
File "/usr/lib/python2.7/dist-packages/pandas/io/sql.py", line 207, in  write_frame
exists = table_exists(name, con, flavor)
File "/usr/lib/python2.7/dist-packages/pandas/io/sql.py", line 275, in table_exists
return len(tquery(query, con)) > 0
File "/usr/lib/python2.7/dist-packages/pandas/io/sql.py", line 90, in tquery
cur = execute(sql, con, cur=cur)
File "/usr/lib/python2.7/dist-packages/pandas/io/sql.py", line 53, in execute
con.rollback()
AttributeError: 'Engine' object has no attribute 'rollback'
Joris确定我的Pandas版本在13.1而不是15.2已经过时。我更新了它,并在下面添加了新的错误

>>> merged.to_sql('name_of_table', ora, schema='schema',     if_exists='append')
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 1504, in to_sql
table.create()
File "/usr/local/lib/python2.7/dist-packages/pandas/io/sql.py", line 637, in create
if self.exists():
File "/usr/local/lib/python2.7/dist-packages/pandas/io/sql.py", line 625, in exists
return self.pd_sql.has_table(self.name, self.schema)
File "/usr/local/lib/python2.7/dist-packages/pandas/io/sql.py", line 1514, in has_table
return len(self.execute(query).fetchall()) > 0
File "/usr/local/lib/python2.7/dist-packages/pandas/io/sql.py", line 1421, in execute
raise_with_traceback(ex)
File "/usr/local/lib/python2.7/dist-packages/pandas/io/sql.py", line 1410, in execute
cur.execute(*args)
pandas.io.sql.DatabaseError: Execution failed on sql 'SELECT name FROM   sqlite_master WHERE type='table' AND name='name_of_table';':     ORA-00911: invalid character

您必须为sql提供sqlalchemy引擎,而不是原始连接。仅sqlite3数据库支持提供DBAPI连接,请参阅


此外,此功能需要0.14或更高版本,以前只支持sqlite和mysql

您应该为sql提供引擎本身,而不是原始连接?连接只支持sqlite,而不支持其他数据库风格,还有第二个问题:您有什么版本的pandas?嘿。谢谢你的提示,我试试看。我使用的是15.2。@joris,我尝试了你的建议,并将我从中得到的回答添加到了上述问题中。还有一件事;当使用read_sql时,我确实将原始连接表示为-xx=pd。read_sql'SELECT*FROM SCHEMA.TABLE',cnx,这很好。查看错误回溯,我认为您没有使用pandas 0.15.2。你能显示pd的输出吗?也许是因为它采用了一种更古老的系统?@joris,你是对的。我是在13.1上通过repo安装的,不是pip,所以更新了它。我在上面添加了新的和更新的错误。
>>> merged.to_sql('name_of_table', ora, schema='schema',     if_exists='append')
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 1504, in to_sql
table.create()
File "/usr/local/lib/python2.7/dist-packages/pandas/io/sql.py", line 637, in create
if self.exists():
File "/usr/local/lib/python2.7/dist-packages/pandas/io/sql.py", line 625, in exists
return self.pd_sql.has_table(self.name, self.schema)
File "/usr/local/lib/python2.7/dist-packages/pandas/io/sql.py", line 1514, in has_table
return len(self.execute(query).fetchall()) > 0
File "/usr/local/lib/python2.7/dist-packages/pandas/io/sql.py", line 1421, in execute
raise_with_traceback(ex)
File "/usr/local/lib/python2.7/dist-packages/pandas/io/sql.py", line 1410, in execute
cur.execute(*args)
pandas.io.sql.DatabaseError: Execution failed on sql 'SELECT name FROM   sqlite_master WHERE type='table' AND name='name_of_table';':     ORA-00911: invalid character