使用 python 代码将数据从 csv 文件加载到 oracle db 时,真值显示为 1,假值显示为 0

While loading the data from csv file into oracle db using python code True value is displaying as 1 and false value is displaying as 0

同时使用 python 代码将数据从 csv 文件加载到 oracle 数据库中。将数据加载到 oracle db 后,真值显示为 1,假值显示为 0 我正在使用以下 python 代码:

import cx_Oracle as orcCon
from cx_Oracle import DatabaseError
import pandas as pd
import csv

csv_input=pd.read_csv(r"E:\Python_projects\test\python1.csv",index_col=False,na_values=" ").fillna('')
#csv_input.head()
#print(csv_input)

try:
    conn = orcCon.connect('scott/tiger@localhost:1522/orcl',encoding="UTF-8")
    if conn:
        print("cx_Oracle version:", orcCon.version)
        print("Database version:", conn.version)
        print("Client version:", orcCon.clientversion())
        
        # Now execute the sqlquery 
        cursor = conn.cursor()
        print("You're connected.................")
        print("TRUNCATING THE TARGET TABLE")
        cursor.execute("TRUNCATE TABLE PYTHON_TESTING")
        print("Inserting data into table")
        for i,row in csv_input.iterrows():
            sql = "INSERT INTO PYTHON_TESTING(C1,C2,C3)VALUES(:1,:2,:3)"
            cursor.execute(sql, tuple(row))
            # the connection is not autocommitted by default, so we must commit to save our changes
            conn.commit()
            #print("Record inserted successfullly")
except DatabaseError as e:
    err, = e.args
    print("Oracle-Error-Code:", err.code)
    print("Oracle-Error-Message:", err.message)

finally:
    cursor.close()
    conn.close()   

我已将测试 csv 文件创建为:

当数据加载到 Oracle 时 Table 数据显示为:

我正在使用 python 3.9.2

您正在将 Python bool 数据类型转换为(Oracle 方言)SQL VARCHAR2 数据类型。在 SQL 中,Oracle 没有布尔值的概念,因此必须存在从一种数据类型到另一种数据类型的映射,典型的映射使用是 True => 1False => 0(如果,在 Python 你尝试 True == 1 那么输出是 True 但如果你尝试 True == 'True' 那么输出是 False).

所以您的 Python 代码正在将 bool 映射到一个整数并将其传递给 Oracle,然后 Oracle 正在从数字到字符串进行隐式转换。

您需要打破隐式转换链并显式转换为您期望的字符串值。

一种方法是将数字真值映射到字符串文字,并且可以使用:

INSERT INTO PYTHON_TESTING(C1,C2,C3)
VALUES(
  CASE :1 WHEN 1 THEN 'TRUE' ELSE 'FALSE' END,
  CASE :2 WHEN 1 THEN 'TRUE' ELSE 'FALSE' END,
  CASE :3 WHEN 1 THEN 'TRUE' ELSE 'FALSE' END
);

另一种方法是,在 Python 中,将元组值从 bool 转换为字符串;类似于:

cursor.execute(sql, tuple('TRUE' if col else 'FALSE' for col in row))