Python 使用sqlalchemy类型将dataframe的未签名int转换为\u sql

Python 使用sqlalchemy类型将dataframe的未签名int转换为\u sql,python,mysql,python-2.7,pandas,sqlalchemy,Python,Mysql,Python 2.7,Pandas,Sqlalchemy,当使用.to_sql()将数据帧写入MySQL数据库时,我无法分配unsigned int类型。我可以使用其他int类型,但就是无法获得未签名的。我正在尝试的一个具有代表性的小样本如下所示: 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:

当使用
.to_sql()
将数据帧写入MySQL数据库时,我无法分配
unsigned int
类型。我可以使用其他
int
类型,但就是无法获得
未签名的
。我正在尝试的一个具有代表性的小样本如下所示:

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}
但最后一行(
id==102
)中
问题的值在写入数据库时被截断为
2147483647
(即
2^31-1

连接中或编写其他标准数据类型(包括
int
)时没有其他问题。我可以使用
sql\u types.BIGINT
选项(使最大值
2^63-1
),但这实际上是不必要的,因为我知道我的值将低于
4294967296
2^32-1
),这基本上是
无符号int
的最大值

所以问题是:我如何使用上面的
.to_sql()
方法分配
无符号int
字段

我使用了来自的
sqlalchemy
类型。 我看到的MySQL类型是。
我已经看到了一个问题,对于MySQL,哪一个可以得到unsigned int,但是它没有使用我想要使用的
.to_sql()
方法。如果我可以简单地从一个
.to_sql()
语句创建表,那将非常理想。

要获得无符号int,可以在mysql整数类型的sqlalchemy构造函数中指定它(请参见关于sqlalchemy的mysql类型):

因此,您可以将其提供给
to_sql
中的
dtype
参数,而不是更一般的
sql\u类型。INT

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

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

谢谢joris,这看起来正是我需要的!我正在尝试运行它,但遇到了一个类型错误:
TypeError:issubclass()arg 1必须是一个类
。我几乎完全按照你的建议做了。进口商品很好用。我已经在这里粘贴了回溯:啊,是的,这是0.15中的一个bug,阻止您使用这样一个实例化类(在提供关键字时就是这样),请参阅。你需要0.16的修复(或者你可以自己应用,因为它只是一个2行修复,请参阅链接公关)完美,它现在可以工作了!我升级到Pandas 0.16(花了一段时间),但是现在
dtype
让我得到了我想要的MySQL类型!谢谢
dtype={'problems': mysql.INTEGER(unsigned=True), ...}