【问题标题】: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 db时,真值显示为1,假值显示为0
【发布时间】:2022-01-04 14:15:23
【问题描述】:

使用 python 代码将数据从 csv 文件加载到 oracle db 时。将数据加载到 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 表数据中的数据显示为:

我正在使用 python 3.9.2

【问题讨论】:

  • edit 带有minimal reproducible example 的问题包括:表格的CREATE TABLE 语句;以及您的预期输出。 Oracle 在 SQL 中没有布尔数据类型,因此不清楚为什么您会对输出不同感到惊讶(除非您期望字符串 'TRUE''FALSE')?
  • 我使用过:CREATE TABLE PYTHON_TESTING (C1 VARCHAR2(30), C2 VARCHAR2(30), C3 VARCHAR2(30));
  • 我希望输出与 Csv 文件相同
  • 如果在 Excel 中将 FALSE 放入 A1,将 0 放入 B1,将 =A1=B1 放入 C1,则 C1 为 TRUE。为什么您希望布尔值映射到字符串文字 'TRUE''FALSE' 而不是数字表示 10
  • 如果你在内循环中添加print(row),那么你会得到true/false值还是1/0值?

标签: python-3.x pandas oracle dataframe cx-oracle


【解决方案1】:

您正在将 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))

【讨论】:

  • 感谢它为我工作
  • 如果该答案解决了您的问题,那么您应该接受它。这有助于未来的提问者遇到相同或相似的问题,并将问题从未回答的队列中删除。请不要将已成功回答的问题视为未回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
相关资源
最近更新 更多