pandas df.to_sql Oracle数据库数据类型不一致
pandas df.to_sql to Oracle database datatype inconsistency
问题
我有一个 pandas 数据框,我正在尝试对 Oracle 数据库使用 pd.df.to_sql()
函数。我的 Oracle 数据库是 19.3c
。看起来很容易吧?为什么它不起作用??
我在其他一些 Whosebug 帖子中看到我应该使用 sqlalchemy 数据类型。好的。链接:
- 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 向数据库发送 SQL 语句)首先 table 然后
if_exist="append"
- 使用
if_exist="replace"
- 仅使用
sqlalchemy
数据类型的 Oracle 特定方言 仅
- 仅使用通用
sqlalchmey
数据类型
- 混合使用两者只是因为我很沮丧
可能是 Oracle 特有的问题?
我没试过的东西:
我没试过的东西:
- 删除 table 并在插入之前重新创建它
to_sql
adhoc 和发送一系列一些 ALTER TABLE tbl_name MODIFY col_name
相关链接:
- Changing the data type of a column in Oracle
我在使用 df.to_sql
时遇到了类似的问题
import sqlalchemy as sa
df_upload.to_sql(
"oracle_table",
db.engine,
schema="SA_COVID",
if_exists="replace",
index=False
dtype=oracle_dtypes
)
像这样更改数据类型:
oracle_dtypes = {
'id' : sa.types.NUMBER(38,0),
'counts' : sa.types.Integer,
'name' : sa.types.VARCHAR2(50),
'swear_words' : sa.types.String(9999)
'date' : sa.types.DATE()
}
原来我需要仔细检查从 API 传入的数据类型到我的 pandas 数据帧(愚蠢地假设数据是干净的)... API 是产生所有字符串,并使用 df.info
确实有帮助。
需要将所有整数、数字和日期转换为 python 中的适当数据类型(这是主要问题),然后可以从那里重新映射数据库数据类型。简而言之...
API (all strings) --> Python (set datatypes) --> Database (map datatypes using sqlalchemy)
我将 pd.Int64Dtype()
用于具有空值的整数列,将 'datetime64[ns]'
用于日期时间。
问题
我有一个 pandas 数据框,我正在尝试对 Oracle 数据库使用 pd.df.to_sql()
函数。我的 Oracle 数据库是 19.3c
。看起来很容易吧?为什么它不起作用??
我在其他一些 Whosebug 帖子中看到我应该使用 sqlalchemy 数据类型。好的。链接:
- 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 向数据库发送 SQL 语句)首先 table 然后
if_exist="append"
- 使用
if_exist="replace"
- 仅使用
sqlalchemy
数据类型的 Oracle 特定方言 仅 - 仅使用通用
sqlalchmey
数据类型 - 混合使用两者只是因为我很沮丧
可能是 Oracle 特有的问题?
我没试过的东西:
我没试过的东西:
- 删除 table 并在插入之前重新创建它
to_sql
adhoc 和发送一系列一些ALTER TABLE tbl_name MODIFY col_name
相关链接:
- Changing the data type of a column in Oracle
我在使用 df.to_sql
import sqlalchemy as sa
df_upload.to_sql(
"oracle_table",
db.engine,
schema="SA_COVID",
if_exists="replace",
index=False
dtype=oracle_dtypes
)
像这样更改数据类型:
oracle_dtypes = {
'id' : sa.types.NUMBER(38,0),
'counts' : sa.types.Integer,
'name' : sa.types.VARCHAR2(50),
'swear_words' : sa.types.String(9999)
'date' : sa.types.DATE()
}
原来我需要仔细检查从 API 传入的数据类型到我的 pandas 数据帧(愚蠢地假设数据是干净的)... API 是产生所有字符串,并使用 df.info
确实有帮助。
需要将所有整数、数字和日期转换为 python 中的适当数据类型(这是主要问题),然后可以从那里重新映射数据库数据类型。简而言之...
API (all strings) --> Python (set datatypes) --> Database (map datatypes using sqlalchemy)
我将 pd.Int64Dtype()
用于具有空值的整数列,将 'datetime64[ns]'
用于日期时间。