SAWarning: 使用sqlalchemy和pd.io.sql.read_sql时无法实例化类型<class 'sqlalchemy.sql.sqltypes.INTEGER'>

2 投票
1 回答
1722 浏览
提问于 2025-04-18 08:57

我想从我的SQLite表中读取pandas的DataFrame。当我运行下面的代码时:

import pandas as pd
import sqlalchemy

dbname = "sqlite:////Users/leda/home/Magnetic_stars/SQLite/Magnetic_stars.sqlite"
engine = sqlalchemy.create_engine(dbname)
res = pd.io.sql.read_sql("SELECT * FROM Resolved;", engine)

我收到了一个SAWarning的警告:

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sqlalchemy/dialects/sqlite/base.py:860: SAWarning: Could not instantiate type <class 'sqlalchemy.sql.sqltypes.INTEGER'> with reflected arguments [u'4']; using no arguments.
 coltype = self._resolve_type_affinity(type_)
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/sqlalchemy/dialects/sqlite/base.py:860: SAWarning: Could not instantiate type <class 'sqlalchemy.sql.sqltypes.INTEGER'> with reflected arguments [u'2']; using no arguments.
 coltype = self._resolve_type_affinity(type_)

想了解更多细节,可以查看我在GitHub上的问题

我哪里做错了?这是个bug吗?

1 个回答

1

好的,看看github上的内容,你的问题似乎已经解决了。为了记录一下,我简单总结一下发生了什么。

根据#7396的内容,我们知道pandas在每次调用read_sql_table的时候,都会检查所有的表。

还有一点是,你的数据库里有一个表,它有一列的类型被sqlite报告为“INT(4)”。

SqlAlchemy(pandas在后台使用的工具)对sqlite的处理方式是把“(4)”部分当作参数传给它的类型构造器。但是sqlalchemy.sql.sqltypes.INTEGER的构造器并不接受任何参数,这就导致了出现了一个警告,并且实际上忽略了这些参数,把INT(4)当作INT来处理。

撰写回答