Pandas to_sql 到 sqlite 返回“引擎”对象没有属性“光标”

Posted

技术标签:

【中文标题】Pandas to_sql 到 sqlite 返回“引擎”对象没有属性“光标”【英文标题】:Pandas to_sql to sqlite returns 'Engine' object has no attribute 'cursor' 【发布时间】:2016-11-14 22:13:42 【问题描述】:

我在 pandas 中有一个 working_df 我想输出到 sqlite 数据库。

from sqlalchemy import create_engine

sql_engine = create_engine('sqlite:///test.db', echo=False)
working_df.to_sql('data', sql_engine,index=False, if_exists='append')

返回:AttributeError: 'Engine' object has no attribute 'cursor'

有什么想法吗?

熊猫版'0.18.1'

编辑:添加完整跟踪

AttributeError                            Traceback (most recent call last)
<ipython-input-41-4f64fc939721> in <module>()
----> 1 working_df.to_sql('data', engine, index=False, if_exists='append')

/Users/tom/anaconda/envs/data_science/lib/python3.5/site-packages/pandas/core/generic.py in to_sql(self, name, con, flavor, schema, if_exists, index, index_label, chunksize, dtype)
   1163         sql.to_sql(self, name, con, flavor=flavor, schema=schema,
   1164                    if_exists=if_exists, index=index, index_label=index_label,
-> 1165                    chunksize=chunksize, dtype=dtype)
   1166 
   1167     def to_pickle(self, path):

/Users/tom/anaconda/envs/data_science/lib/python3.5/site-packages/pandas/io/sql.py in to_sql(frame, name, con, flavor, schema, if_exists, index, index_label, chunksize, dtype)
    569     pandas_sql.to_sql(frame, name, if_exists=if_exists, index=index,
    570                       index_label=index_label, schema=schema,
--> 571                       chunksize=chunksize, dtype=dtype)
    572 
    573 

/Users/tom/anaconda/envs/data_science/lib/python3.5/site-packages/pandas/io/sql.py in to_sql(self, frame, name, if_exists, index, index_label, schema, chunksize, dtype)
   1659                             if_exists=if_exists, index_label=index_label,
   1660                             dtype=dtype)
-> 1661         table.create()
   1662         table.insert(chunksize)
   1663 

/Users/tom/anaconda/envs/data_science/lib/python3.5/site-packages/pandas/io/sql.py in create(self)
    688 
    689     def create(self):
--> 690         if self.exists():
    691             if self.if_exists == 'fail':
    692                 raise ValueError("Table '%s' already exists." % self.name)

/Users/tom/anaconda/envs/data_science/lib/python3.5/site-packages/pandas/io/sql.py in exists(self)
    676 
    677     def exists(self):
--> 678         return self.pd_sql.has_table(self.name, self.schema)
    679 
    680     def sql_schema(self):

/Users/tom/anaconda/envs/data_science/lib/python3.5/site-packages/pandas/io/sql.py in has_table(self, name, schema)
   1674         query = flavor_map.get(self.flavor)
   1675 
-> 1676         return len(self.execute(query, [name, ]).fetchall()) > 0
   1677 
   1678     def get_table(self, table_name, schema=None):

/Users/tom/anaconda/envs/data_science/lib/python3.5/site-packages/pandas/io/sql.py in execute(self, *args, **kwargs)
   1557             cur = self.con
   1558         else:
-> 1559             cur = self.con.cursor()
   1560         try:
   1561             if kwargs:

AttributeError: 'Engine' object has no attribute 'cursor'

【问题讨论】:

您确定选择的是正确的 pandas 版本吗?您能否在出现该错误的同一会话中显示pd.__version__ 的输出?如果您有旧版 pandas (,通常会出现此错误 pd.__version__ 返回'0.18.1',我看到这是一个较旧的熊猫问题,这就是为什么它很奇怪 继续旧问题***.com/questions/30631325/…,我做了一个engine.raw_connection(),当应用于to_sql时,它似乎工作 由于某种原因,它认为它不是一个 sqlalchemy 引擎(所以退回到 sqlite 连接)。你能显示pd.io.sql._is_sqlalchemy_connectable(sql_engine)的输出吗? 还有isinstance(sql_engine, sqlalchemy.engine.Connectable)? 【参考方案1】:

添加 raw_connection() 对我有用

from sqlalchemy import create_engine

sql_engine = create_engine('sqlite:///test.db', echo=False)
connection = sql_engine.raw_connection()
working_df.to_sql('data', connection,index=False, if_exists='append')

我在笔记本会话期间有conda install sqlalchemy,所以虽然它可以访问,但由于我已经启动了 pandas,所以看起来好像没有 sqlalchemy。重新启动会话允许我删除 raw_connection()。

from sqlalchemy import create_engine

sql_engine = create_engine('sqlite:///test.db', echo=False)
connection = sql_engine.raw_connection()
working_df.to_sql('data', connection,index=False, if_exists='append')

【讨论】:

我使用的是 Jupyter。在pip install sqlalchemy 之后,我只需要重新启动 Jupyter 内核,pandas 就可以使用 sqlalchemy。 我在 REPL 中并在另一个终端选项卡中安装了 SQLAlchemy,而没有重新启动 REPL。总体而言,SQLAlchemy 需要在加载 Pandas 时可用。 完全正确,@jjmontes。在尝试任何操作之前重新启动。 对我来说,没有重启问题,这个从connect()raw_connection() 的更改成功了。最重要的是,连接上的with 语句也是不可能的,最后我必须手动conn.close() 它,请参阅 [Python Error: AttributeError: enter [without the markup: __enter__ ])](***.com/questions/51427729/…)。我认为 sqlalchemy 是一个标准?【参考方案2】:
from sqlalchemy import create_engine
sql_engine = create_engine('sqlite:///test.db', echo=False)
working_df.to_sql('data', sql_engine,index=False, if_exists='append')

你可以尝试使用引擎对象的connect方法而不是引擎对象本身,而不是上面的代码。,

sql_engine = create_engine('sqlite:///test.db', echo=False)
conn = sql_engine.connect()
working_df.to_sql('data', conn,index=False, if_exists='append')

尝试上述步骤,如果您仍然遇到问题,请告诉我。

【讨论】:

我在这篇文章中遇到了同样的问题。我试过你的建议,但现在的错误是AttributeError: 'Connection' object has no attribute 'cursor' @LucasAimaretto 连接和引擎都没有游标方法。我假设您的游标目的是获取存储的结果。为此,您可以使用连接的执行方法。可以参考link。【参考方案3】:

当我将数据推送到 MS Sql Server 时,以下代码给了我同样的错误:

engine_string = 'mssql+pyodbc://'+username_dsdb+':'+password_dsdb+'@'+server_dsdb+':1433/'+database_dsdb+'?driver=ODBC Driver 13 for SQL Server'
engine = sqlalchemy.create_engine(engine_string,deprecate_large_types=True)

conn_dsdb = engine.connect()

df_year_week_contract_wise.to_sql("KPIEngine_FACT_Historical", conn_dsdb, index=False, if_exists='append')

conn_dsdb.close()

但是,然后我重新启动了会话,它工作正常。

【讨论】:

对我来说同样需要重新启动会话(对于 jupyter 重新启动内核)。我认为主要问题是在同一个 python 会话上,之前有一个连接(可能与 pyodbc),但它挂起并且没有正确关闭(发生不与上下文一起使用)。【参考方案4】:

这是一个老问题,但本周我遇到了同样的错误,结果证明我的 Mac 上的 mysqldb 存在问题。作为测试,我尝试“将 MySQLdb 导入为 mysql”并发现 ImportError:“未加载库:libmysqlclient.18.dylib”

在我的情况下,解决方案是按照Python mysqldb: Library not loaded: libmysqlclient.18.dylib 中的建议向缺少的库添加符号链接

【讨论】:

以上是关于Pandas to_sql 到 sqlite 返回“引擎”对象没有属性“光标”的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用to_sql方法将dataframe注册为数据库表进行数据整合和数据清洗并不对比SQL操作和dataframe操作

pandas df.to_sql 到 Oracle 数据库数据类型不一致

Pandas 与 to_sql 的 ODBC 连接

写入 MySQL 时查询 sqlite_master 表时出现 to_sql() 错误

在 pandas.to_sql() 中使用“可调用”方法的示例?

使用 Pandas .to_sql 将 JSON 列写入 Postgres