【发布时间】:2021-11-21 03:05:08
【问题描述】:
我有这段代码来创建表并将数据导入 Oracle 数据库
# Connect to DB
conn = connect_to_oracle(user_db, pw_db)
connection = conn.raw_connection()
cursor = connection.cursor()
# Setting Param
test = pd.read_csv(r"template.csv",
dtype={'updated_date':'str'})
cursor.execute('''
CREATE TABLE customers_test
( updated_date VARCHAR2(100) NOT NULL,
id_1 VARCHAR2(100) NOT NULL,
id_2 VARCHAR2(100) NOT NULL,
type VARCHAR2(10) NOT NULL,
score float(10) NOT NULL,
lvl VARCHAR2(10) NOT NULL,
sgmt VARCHAR2(10))
''')
之后我使用 to_sql 函数导入数据
test.to_sql('CUSTOMER_TEST', engine, schema, if_exists='append', index=False)
但是,当我检查 DB 时,我发现几乎所有的列都变成了 CLOB
UPDATED_DATE, CLOB
ID_1, CLOB
ID_2, CLOB
TYPE, CLOB
SCORE, FLOAT
LVL, CLOB
SGMT, CLOB
所以我想知道如何将所有列转换为 varchar2?如何防止它们变成 CLOB?谢谢
【问题讨论】:
-
能否请您检查 2 个时刻:1. 您正在运行代码的 DB 与您正在检查表定义的 DB 相同(我不是在开玩笑,我曾多次遇到此问题) ; 2. 请尝试显式删除表格并在之后运行您的代码。如果它当然已经没有数据了
-
@ekochergin 我再次检查了数据库和我的代码。那是同一个数据库。我还删除了该表并尝试再次运行代码。但是结果是一样的
-
你用的是什么版本的cx_Oracle和python?
-
我在客户端使用 cx_Oracle 8.0 python 3.7,在数据库端使用 Oracle 19.6。我运行您的代码,但无法重现您的问题。在我的情况下,它可以正常工作,并且列被创建为 varchar2
-
现在我知道为什么了。当我使用 sqlalchemy 中的 to_sql 函数时,我没有为表中的每一列指定 dtype。 => 解决方案:添加dtype并运行代码
标签: python database oracle sqlalchemy