使用sqlalchemy类型

时间:2015-07-01 22:00:00

标签: python mysql python-2.7 pandas sqlalchemy

使用unsigned int将数据帧写入MySQL数据库时,我无法指定.to_sql()类型。我可以使用其他int类型,但无法获得unsigned。我正在尝试的一个小代表性样本看起来像这样:

import pandas as pd
from sqlalchemy import create_engine
import sqlalchemy.types as sql_types

db_engine = create_engine('mysql://db_user:db_pass@db_host:db_port/db_schema')

d = {'id': [100,101,102], 'items': [6,10,20000], 'problems': [50,72,2147483649]} # Representative sample dictionary
df = pd.DataFrame(d).set_index('id')

这给出了:

>>> df
         items    problems
id
100          6          50
101         10          72
102      20000  2147483649

我按如下方式写入数据库:

df.to_sql('my_table',
          db_engine,
          flavor='mysql',
          if_exists='replace',
          index_label=['id'],
          dtype={'id': sql_types.SMALLINT,
                 'items': sql_types.INT,
                 'problems': sql_types.INT}

但是当写入数据库时​​,最后一行problemsid==102的值被截断为21474836472^31-1)会发生什么。< / p>

连接中或编写其他标准数据类型时没有其他问题,包括int。我可以通过使用sql_types.BIGINT选项(最大2^63-1)来逃避,但这实际上是不必要的,因为我知道我的值会低于{{1 (4294967296),基本上是2^32-1最大值。

问题是:如何使用上述unsigned int方法分配unsigned int字段?

我使用了here中的.to_sql()类型。 我看到的MySQL类型是here。 我已经看到问题here确实获得了MySQL的unsigned int,但它没有使用我想要使用的sqlalchemy方法。如果我可以简单地从单.to_sql()语句创建表,那将是理想的。

1 个答案:

答案 0 :(得分:1)

要获得unsigned int,可以在mysql的INTEGER类型的sqlalchemy构造函数中指定它(有关sqlalchemy的mysql类型,请参阅the docs):

In [23]: from sqlalchemy.dialects import mysql

In [24]: mysql.INTEGER(unsigned=True)
Out[24]: INTEGER(unsigned=True)

因此,您可以将此提供给dtype中的to_sql参数,而不是更一般的sql_types.INT

dtype={'problems': mysql.INTEGER(unsigned=True), ...}

注意:您至少需要pandas 0.16.0才能正常工作。