python - pandas df.to_sql 到 Oracle 数据库数据类型不一致
问题描述
问题
我有一个 pandas 数据框,我正在尝试将该pd.df.to_sql()
函数用于 Oracle 数据库。我的 Oracle 数据库是19.3c
. 看起来很容易对吧?为什么不行??
我在其他一些 stackoverflow 帖子中看到我应该使用 sqlalchemy 数据类型。好的。链接:
- Pandas 和 SQL Alchemy:指定列数据类型
- Pandas to_sql 更改数据库表中的数据类型
- 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
或其他一些随机数据类型。我该怎么办?
我尝试过的事情
我试过了,还是不行...
- 先对表进行 trucating(从 python 向数据库发送 SQL 语句)然后
if_exist="append"
- 使用
if_exist="replace"
- 仅
sqlalchemy
使用 Oracle 特定的数据类型方言 - 仅使用通用
sqlalchmey
数据类型 - 使用两者的混合只是 bc 我很沮丧
也许这是 Oracle 特定的问题?
我没有尝试过的事情:
我没有尝试过的事情:
- 删除表并在插入之前重新创建它
to_sql
adhoc 和发送一系列的一些ALTER TABLE tbl_name MODIFY col_name
相关链接:
解决方案
结果我需要仔细检查从 API 传入的数据类型到我的 pandas 数据框中(做了一个愚蠢的假设,数据是干净的)...... API 产生了所有字符串,并且使用df.info
真的很有帮助。
需要将所有整数、数字和日期转换为 python 中的适当数据类型(这是主要问题),并且可以从那里重新映射数据库数据类型。简而言之...
API(所有字符串)--> Python(设置数据类型)--> 数据库(使用 sqlalchemy 映射数据类型)
我使用了pd.Int64Dtype()
具有空值的整数列和'datetime64[ns]'
日期时间。
推荐阅读
- java - 我想缩短这个方法,你能帮我吗?
- octobercms - 将 Viewbag 变量从主题设置传递给组件
- kotlin - 不确定在房间的哪里自动生成主键
- c# - 当有文件存储在 Azure Blob 存储中时触发 API 终结点
- macos - 知道 NSPopoverTouchBarItem 何时会显示其折叠视图
- plugins - 如何让插件执行另一个插件的命令?
- ruby-on-rails - activeadmin 关联下拉列表中的多个属性
- python - 从 django rest 框架中的 APIview 获取数据
- c# - LINQ:从多个表中搜索/过滤数据
- java - 我应该如何在 Kafka 中实现延迟主题架构