【发布时间】:2018-07-05 21:09:49
【问题描述】:
在使用 pandas 和 dask 读取 SQLite 表时,我在从存储为 NUMERIC 数据类型的日期时间(ISO 格式字符串)的 SQLite 表中进行选择时遇到了 SQLAlchemy 的一些意外行为。 SQLAlchemy 原始 SQL 查询工作正常,但使用从反射构造的可选查询失败。这两个查询似乎是等价的。
我在下面粘贴了一个示例以及回溯。有人可以解释示例中的第三个查询有什么问题吗?
使用 NUMERIC 日期时间设置表:
import sqlalchemy as sa
from sqlalchemy import text
connString = "sqlite:///c:\\temp\\test.db"
engine = sa.create_engine(connString)
conn = engine.connect()
conn.execute("create table testtable (uid INTEGER Primary Key, datetime NUMERIC)")
conn.execute("insert into testtable values (1, '2017-08-03 01:11:31')")
print(conn.execute('PRAGMA table_info(testtable)').fetchall())
# [(0, 'uid', 'INTEGER', 0, None, 1), (1, 'datetime', 'NUMERIC', 0, None, 0)]
使用原始 SQL 进行查询:
resultList1 = conn.execute("SELECT testtable.uid, testtable.datetime \nFROM testtable").fetchall()
print(resultList1)
# [(1, '2017-08-03 01:11:31')]
用这个可选择的作品查询:
resultList2 = conn.execute(sa.sql.select(columns=[text('uid'),text('datetime')]).select_from(text('testtable'))).fetchall()
print(resultList2)
# [(1, '2017-08-03 01:11:31')]
使用这个可选的查询失败:
m = sa.MetaData()
table = sa.Table('testtable', m, autoload=True, autoload_with=engine)
selectble = sa.sql.select(table.columns).select_from(table)
print(selectble.compile().string)
# note: same raw sql query as above
# "SELECT testtable.uid, testtable.datetime \nFROM testtable"
resultList3 = conn.execute(sa.sql.select(table.columns).select_from(table)).fetchall()
# SAWarning: Dialect sqlite+pysqlite does *not* support Decimal objects natively...
print(resultList3)
conn.close()
错误:
Traceback (most recent call last):
File "<ipython-input-20-188c84a35d95>", line 1, in <module>
print(resultList3)
File "c:\program files\python36\lib\site-packages\sqlalchemy\engine\result.py", line 156, in __repr__
return repr(sql_util._repr_row(self))
File "c:\program files\python36\lib\site-packages\sqlalchemy\sql\util.py", line 329, in __repr__
", ".join(trunc(value) for value in self.row),
TypeError: must be real number, not str
【问题讨论】:
标签: python sqlite sqlalchemy