【问题标题】:convert clob to varchar python将 clob 转换为 varchar python
【发布时间】: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


【解决方案1】:

在正常情况下,代码应该可以正常工作

Python 示例代码

import cx_Oracle

host="ODCGRC1R.SCGER.DEV.CORP"
port=60995
sid='odcgrc1r'
user='CPL_REP'
password='Cpl3_r3p'
sid = cx_Oracle.makedsn(host, port, service_name=sid)

connection = cx_Oracle.connect(user, password, sid, encoding="UTF-8")
cursor = connection.cursor()
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))
''')

现在我对我的数据库执行 tnsping,运行 python 代码并通过sqlplus 连接以验证表结构

C:\python>tnsping ODCGRC1R.SCGER.DEV.CORP:60995/odcgrc1r

TNS Ping Utility for 32-bit Windows: Version 11.2.0.1.0 - Production on 29-SEP-2021 10:51:34

Copyright (c) 1997, 2010, Oracle.  All rights reserved.

Parameterdateien benutzt:
C:\Programme\Oracle\11.2.0\client\network\admin\sqlnet.ora

Adapter HOSTNAME zur Aufl÷sung des Alias benutzt
Verbindungsversuch mit (DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=odcgrc1r))(ADDRESS=(PROTOCOL=TCP)(HOST=180.22.128.47)(PORT=60995)))
OK (140 ms)

C:\python> C:\python>tnsping ODCGRC1R.SCGER.DEV.CORP:60995/odcgrc1r

TNS Ping Utility for 32-bit Windows: Version 11.2.0.1.0 - Production on 29-SEP-2021 10:51:34

Copyright (c) 1997, 2010, Oracle.  All rights reserved.

Parameterdateien benutzt:
C:\Programme\Oracle\11.2.0\client\network\admin\sqlnet.ora

Adapter HOSTNAME zur Aufl÷sung des Alias benutzt
Verbindungsversuch mit (DESCRIPTION=(CONNECT_DATA=(SERVICE_NAME=odcgrc1r))(ADDRESS=(PROTOCOL=TCP)(HOST=180.22.128.47)(PORT=60995)))
OK (140 ms)

C:\python> python testconn.py

C:\python>sqlplus cpl_rep/Cpl3_r3p@//ODCGRC1R.SCGER.DEV.CORP:60995/odcgrc1r

SQL*Plus: Release 12.2.0.1.0 Production on Wed Sep 29 10:52:48 2021

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Last Successful login time: Wed Sep 29 2021 10:47:26 +02:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

SQL> desc cpl_rep.customers_test
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 UPDATED_DATE                              NOT NULL VARCHAR2(100)
 ID_1                                      NOT NULL VARCHAR2(100)
 ID_2                                      NOT NULL VARCHAR2(100)
 TYPE                                      NOT NULL VARCHAR2(10)
 SCORE                                     NOT NULL FLOAT(10)
 LVL                                       NOT NULL VARCHAR2(10)
 SGMT                                               VARCHAR2(10)

但是如果你没有在to_sql 函数中指定正确的dtype,你可以得到这个行为,正如问题的海报所说的那样。

【讨论】:

  • 谢谢,我终于发现我没有在to_sql函数中指定dtype。修改代码后,格式正确。
  • @Long_NgV,很高兴知道。确实很奇怪。
  • @Long_NgV,我会把你的评论放在答案中,其他人可能会得到帮助。如果你这么好心,请采纳答案。
  • 完成,只需在你的答案中添加 dtype 部分,这样每个人都会看到如何解决这个问题
  • @Long_NgV,谢谢你的好意。
猜你喜欢
  • 2013-01-30
  • 2013-04-16
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-07
相关资源
最近更新 更多