使用 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 => 1
和 False => 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))
同时使用 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 => 1
和 False => 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))