问题
我有一个pandas dataframe,我正在尝试使用pd.df.to_sql()
函数到Oracle数据库。Oracle数据库是19.3c
。似乎很容易吧?为什么不行??
我在其他一些stackoverflow帖子中看到,我应该使用sqlalchemy数据类型。好的。链接:
- Pandas and SQL Alchemy: Specify Column Data Types
- Pandas to_sql changing datatype in database table
- https://docs.sqlalchemy.org/en/14/dialects/oracle.html#oracle-data-types
from sqlalchemy.types import Integer, String
from sqlalchemy.dialects.oracle import NUMBER, VARCHAR2, DATE
oracle_dtypes = {
'id' : NUMBER(38,0),
'counts' : Integer,
'name' : VARCHAR2(50),
'swear_words' : String(9999)
'date' : DATE()
}
df_upload.to_sql(
"oracle_table",
db.engine,
schema="SA_COVID",
if_exists="replace",
index=False
dtype=oracle_dtypes
)
它从不失败地将随机组转换为CLOB
或其他随机数据类型。我该怎么办?
我尝试过的事情
我试过了但没有成功...
- 首先创建表(从python向db发送SQL语句),然后创建
if_exist="append"
- 使用
if_exist="replace"
- 使用Oracle特定方言
sqlalchemy
数据类型 * 仅 * - 仅使用通用
sqlalchmey
数据类型 * - 两者的混合使用只是BC我很沮丧
也许这是一个甲骨文特有的问题?
Things I haven't tried:
我没试过的东西:
- 删除表并在插入之前重新创建它
to_sql
adhoc和发送一系列的一些ALTER TABLE tbl_name MODIFY col_name
相关链接:
2条答案
按热度按时间aemubtdh1#
原来我需要仔细检查从API传入的数据类型到我的pandas dataframe(做了一个愚蠢的假设,数据是干净的)... API生成所有字符串,使用
df.info
确实很有帮助。需要将所有的整数,数字和日期转换为python中适当的数据类型(这是主要问题),并从那里可以重新Map数据库数据类型。总之...
API(所有字符串)--> Python(设置数据类型)--> Database(使用sqlalchemyMap数据类型)
我使用
pd.Int64Dtype()
来表示具有空值的整数列,使用'datetime64[ns]'
来表示日期时间。biswetbf2#
我在使用
df.to_sql
时遇到了类似的问题像这样更改dtypes: