如何覆盖/阻止sqlalchemy使用浮点类型?

时间:2015-03-20 02:12:05

标签: python numpy pandas sqlalchemy

我一直在使用pandas来转换原始文件数据并导入数据库。通常我们使用大整数作为主键。当使用pandas to_sql函数而不显式指定列类型时,它有时会自动将大整数指定为float(而不是bigint)。

你可以想象,当我们意识到我们的选择和连接都没有工作时,很多头发都丢失了。

当然,我们可以通过试验错误手动将问题列分配为bigint,但我们完全禁止浮动,而是强制使用bigint,因为我们使用的是非常大量的表,有时候我们不能花时间单独进行事实检查,这是一个非常大量的列。我们基本上从不想在任何表定义中使用float类型。

以bigint方式覆盖浮点类型(在pandas,sqlalchemy或numpy中)?


即:

import pandas as pd
from sqlalchemy import create_engine

e = create_engine('mysql+pymysql://user:pass@host')

columns = ['foo', 'bar']
data = [
    [123456789, 'one'],
    [234567890, 'two'],
    [345678901, 'three']
]

df = pd.DataFrame(data=data, columns=columns)
df.to_sql('table', e, flavor='mysql', schema='schema', if_exists='replace')

不幸的是,此代码不会重现该效果。它承诺作为bigint。当从某些csv或xls文件加载数据时会发生这种情况,它发生在从一个MySQL数据库传输到另一个MySQL数据库(latin1)时,它会假设是等距副本。

根本没有代码,只是:

import pandas as pd
from sqlalchemy import create_engine

e = create_engine('mysql+pymysql://user:pass@host')

df = pd.read_sql('SELECT * FROM source_schema.source_table;', e)
df.to_sql('target_table', e, flavor='mysql', schema='target_schema')

创建testfile.csv:

thing1,thing2
123456789,foo
234567890,bar
345678901,baz

也没有重现这种效果。我知道它来自NPPES Dissemination的数据,或许它与编码有关吗?我必须将文件从WIN-1252转换为UTF-8,以便MySQL甚至接受它们。

0 个答案:

没有答案