【问题标题】:Loading CSV to MySQL with odo and SQLAlchemy使用 odo 和 SQLAlchemy 将 CSV 加载到 MySQL
【发布时间】:2017-04-19 10:25:56
【问题描述】:

我正在使用 odo 将 CSV 文件写入 MySQL 表。

uri = 'mysql+pymysql://username:password@database/schema::table'
odo('data.csv', uri)

当我没有指定datashape 时,将创建 MySQL 表,其中所有字符串列作为 TEXT,所有整数列作为 BIGINT(20)。因此,我尝试了以下数据形状,并得到以下错误:

dshape = '{} * {{ \
    ID: 10 * string, \
    FOO: float16, \
    URL: 175 * var * string, \
    PRICE: uint32, \
    BAR: int8, \
}}'.format(num_rows)
uri = 'mysql+pymysql://username:password@database/schema::table'
odo('data.csv', uri, dshape=dshape)

NotImplementedError: 没有 SQLAlchemy dtype 匹配 datashape: var

NotImplementedError:没有 SQLAlchemy dtype 与 datashape 匹配:float16

NotImplementedError: 没有 SQLAlchemy dtype 匹配 datashape: uint32

NotImplementedError: 没有 SQLAlchemy dtype 匹配 datashape: int8

例如,理想情况下,我可以将 int8 映射到 TINYINT,将 175 * var * 字符串映射到 VARCHAR(175),将 10 * 字符串映射到 CHAR(10),但似乎 SQLAlchemy 不支持这一点.我解决并将所有数据类型设置为 int32 或 float32,并从字符串类型中删除了 var 名称。

dshape = '{} * {{ \
    ID: 10 * string, \
    FOO: float32, \
    URL: 175 * string, \
    PRICE: int32, \
    BAR: int32, \
}}'.format(num_rows)
uri = 'mysql+pymysql://username:password@database/schema::table'
odo('data.csv', uri, dshape=dshape)

这会将 int32 映射到 INT(11) 并将 float32 映射到 DOUBLE。我可以忍受这个。但我不能接受我所有的字符串列仍然在 MySQL 上写为 TEXT。

我必须如何更改我的数据形状才能在 MySQL 中获取 CHAR 和 VARCHAR 数据类型?

【问题讨论】:

    标签: python mysql sqlalchemy odo datashape


    【解决方案1】:

    你可以尝试使用 pandas 和 sqlalchemy 来实现同样的效果

    import pandas as pd
    import sqlalchemy
    from sqlalchemy import create_engine
    engine = create_engine('mysql://username:password@host:port/database', echo=False)
    
    #read csv into Dataframe
    df = pd.read_csv('data.csv')
    
    #write csv into Sql
    df.to_sql('Table_Name', con=engine, if_exists='replace',index=False)
    

    它将读取 data.csv 文件并将其放入您的数据库中的 Table_Name

    【讨论】:

    • 我开始使用 pandas,但发现它非常低效。这篇文章解释了为什么不使用 pandas 将 CSV 加载到 MySQL:odo.pydata.org/en/latest/perf.html,所以如果可以的话,我会避免使用该选项。
    猜你喜欢
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多