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), ...}