使用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}
但是当写入数据库时,最后一行problems
中id==102
的值被截断为2147483647
(2^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()
语句创建表,那将是理想的。
答案 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才能正常工作。