【发布时间】:2015-03-02 05:00:51
【问题描述】:
Pandas 有一个可爱的 to_sql 方法,用于将数据帧写入 SQLAlchemy 支持的任何 RDBMS。
假设我有一个这样生成的数据框:
df = pd.DataFrame([-1.04, 0.70, 0.11, -0.43, 1.0], columns=['value'])
如果我尝试在没有任何特殊行为的情况下将其写入数据库,则会得到双精度列类型:
df.to_sql('foo_test', an_engine)
如果我想要不同的数据类型,我可以指定它(这很好用):
df.to_sql('foo_test', an_engine, dtype={'value': sqlalchemy.types.NUMERIC})
但如果我想设置NUMERIC 列的精度和比例,它会在我的脸上炸开:
df.to_sql('foo_test', an_engine, dtype={'value': sqlalchemy.types.NUMERIC(10,2)})
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-77-dc008463fbfc> in <module>()
1 df = pd.DataFrame([-1.04, 0.70, 0.11, -0.43, 1.0], columns=['value'])
----> 2 df.to_sql('foo_test', cosd_engine, dtype={'value': sqlalchemy.types.NUMERIC(10,2)})
/Users/igazit/.virtualenvs/myproject/lib/python2.7/site-packages/pandas/core/generic.pyc in to_sql(self, name, con, flavor, schema, if_exists, index, index_label, chunksize, dtype)
964 self, name, con, flavor=flavor, schema=schema, if_exists=if_exists,
965 index=index, index_label=index_label, chunksize=chunksize,
--> 966 dtype=dtype)
967
968 def to_pickle(self, path):
/Users/igazit/.virtualenvs/myproject/lib/python2.7/site-packages/pandas/io/sql.pyc in to_sql(frame, name, con, flavor, schema, if_exists, index, index_label, chunksize, dtype)
536 pandas_sql.to_sql(frame, name, if_exists=if_exists, index=index,
537 index_label=index_label, schema=schema,
--> 538 chunksize=chunksize, dtype=dtype)
539
540
/Users/igazit/.virtualenvs/myproject/lib/python2.7/site-packages/pandas/io/sql.pyc in to_sql(self, frame, name, if_exists, index, index_label, schema, chunksize, dtype)
1162 import sqlalchemy.sql.type_api as type_api
1163 for col, my_type in dtype.items():
-> 1164 if not issubclass(my_type, type_api.TypeEngine):
1165 raise ValueError('The type of %s is not a SQLAlchemy '
1166 'type ' % col)
TypeError: issubclass() arg 1 must be a class
我试图深入研究为什么 sqlalchemy.types.NUMERIC 的类型通过了 1164 的测试,而 sqlalchemy.types.NUMERIC(10,2) 却没有。它们确实有不同的类型(sqlalchemy.sql.visitors.VisitableType vs sqlalchemy.sql.sqltypes.NUMERIC)。
任何线索将不胜感激!
【问题讨论】:
-
最近提交了一个与您所描述的类似的错误github.com/pydata/pandas/issues/9083
-
@BobHaffner 这似乎是正确的。想用那个链接回答这个问题,这样我就可以给你一个大的绿色复选标记? :)
-
答案提供了一个很好的解决方法,修复本身将包含在即将发布的 0.16 版本中
标签: python postgresql pandas sqlalchemy