无法使用Python SqlAlchemy将数据写入Vertica数据库-类型“ TEXT”不存在

时间:2018-07-10 08:28:05

标签: python pandas sqlalchemy vertica

我正在尝试将熊猫数据框上传到Vertica数据库 能够使用sqlalchemy设置引擎和查询数据库。

但是,当我尝试从pandas dataframe上传数据时,由于类型“ TEXT”不存在而出现错误消息。我正在使用Windows 10,并创建了ODBC连接。

import sqlalchemy as sa
engine = sa.create_engine('vertica+pyodbc:///?odbc_connect=%s' %(urllib.parse.quote('DSN=TESTDB'),))
sql_query = "select * from sample_table"
df = pd.read_sql_query(sql_query, con=engine) # this works, get the data as required in the dataframe
*df.apply[Do various data transformations as required]*

# Write back to the database
df.to_sql(name='sample_table_cleaned', con = engine, schema = "Dev" , if_exists = 'append', index = True)

上面的代码(df.to_sql)代码段显示错误如下:ProgrammingError:(pyodbc.ProgrammingError)('42704','[42704]错误5108:类型“ TEXT”不存在\ n (5108)(SQLExecDirectW)')

任何人都可以帮忙吗

预先感谢!

2 个答案:

答案 0 :(得分:1)

在工作中遇到了类似的事情,并且使用字符串对象的列使用VARCHAR更改了类型

    dtypedict = {}  # create and empty dictionary
    for i,j in zip(df_para.columns, df_para.dtypes):
        if "object" in str(j):
            dtypedict.update({i: sa.types.VARCHAR})

    return dtypedict

updatedict = updateType(df)  # update the datafraame type

答案 1 :(得分:1)

不错的解决方案@calestini !

import sqlalchemy as sa 

engine = create_engine('vertica+vertica_python://user:{}@host:5433/db_name')

df.to_sql(name='table_name', schema = 'schema_name', con = engine, if_exists='append', dtype = updatedict, index = False)

这是运行您的函数后数据类型字典的外观:

{'custom_index': sqlalchemy.sql.sqltypes.VARCHAR,
 'lastmodifiedbysales': sqlalchemy.sql.sqltypes.VARCHAR,
 'linked_distributor': sqlalchemy.sql.sqltypes.VARCHAR,
 'linked_reseller': sqlalchemy.sql.sqltypes.VARCHAR,
 'number_of_licenses': sqlalchemy.sql.sqltypes.VARCHAR}

谢谢!