【问题标题】:The type of <field> is not a SQLAlchemy type with Pandas to_sql to an Oracle database<field> 的类型不是带有 Pandas to_sql 到 Oracle 数据库的 SQLAlchemy 类型
【发布时间】:2019-05-21 10:35:11
【问题描述】:

我有一个包含多个分类字段的 pandas 数据框。

SQLAlchemy 抛出异常“类型不是 SQLAlchemy 类型”。 我尝试将对象字段转换回字符串,但得到相同的错误。

dfx = pd.DataFrame()
for col_name in df.columns:
    if(df[col_name].dtype == 'object'):
        dfx[col_name] = df[col_name].astype('str').copy()
    else:
        dfx[col_name] = df[col_name].copy()
    print(col_name, dfx[col_name].dtype)

 dfx.to_sql('results', con=engine, dtype=my_dtypes,  if_exists='append', method='multi', index=False)

尽管使用 .copy() 创建了一个新表,但新的 dfx 似乎具有相同的分类

另外,附带说明一下,为什么 to_sql() 会生成带有 CLOB 的 CREATE TABLE?

【问题讨论】:

    标签: pandas sqlalchemy


    【解决方案1】:

    这里不需要使用 copy() 函数,也不需要从 'object' 转换为 'str'。

    您正在写入 Oracle 数据库吗?文本数据(包括“对象”)的默认输出类型是 CLOB。您可以通过指定要使用的 dtype 来解决它。例如:

    import pandas as pd
    from sqlalchemy import types, create_engine
    from sqlalchemy.exc import InvalidRequestError 
    conn = create_engine(...)
    
    testdf = pd.DataFrame({'pet': ['dog','cat','mouse','dog','fish','pony','cat']
                          , 'count': [2,6,12,1,45,1,3]
                          , 'x': [105.3, 98.7, 112.4, 3.6, 48.9, 208.9, -1.7]})
    test_types = dict(zip(
        testdf.columns.tolist(),
        (types.VARCHAR(length=20), types.Integer(), types.Float()) ))
    
    try:
        testdf.to_sql( name="test", schema="myschema"
                  , con=conn
                  , if_exists='replace'  #'append'
                  , index=False
                  , dtype = test_types)
        print (f"Wrote final input dataset to table {schema}.{table2}")
    except (ValueError, InvalidRequestError):
        print ("Could not write to table 'test'.")
    

    如果您不是写给 Oracle,请指定您的目标数据库 - 也许其他具有该 DBMS 经验的人可以为您提供建议。

    【讨论】:

    • 这适用于您的示例,但当我尝试传入我自己的所有 dtypes 对象的数据框时不起作用。有任何想法吗。错误消息:'''文件“C:\ProgramData\Anaconda3\lib\site-packages\sqlalchemy\dialects\oracle\cx_oracle.py”,第 1015 行,在 do_executemany cursor.executemany(语句,参数)类型错误:期望数字' ''
    猜你喜欢
    • 2019-02-16
    • 2019-04-17
    • 1970-01-01
    • 2021-12-09
    • 2021-05-23
    • 2021-03-02
    • 2019-12-21
    • 2015-03-02
    • 2015-09-19
    相关资源
    最近更新 更多