我有一个熊猫数据框,其中有几个分类字段。
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?
答案 0 :(得分:0)
这里不需要使用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经验的人可以为您提供建议。