Вставка данных csv или dict в базу данных с использованием cx_oracle python
Я запускаю код ниже для вставки данных csv в базу данных Oracle. код работает нормально до создания файла csv.
DEFAULT_CONFIG = "~/.oci/config"
DEFAULT_PROFILE = "DEFAULT"
config_file="config.json"
atp_dict_data=[]
db_username = "xx"
db_password = "xx"
db_type = "xx"
class DbConnect(object):
comp_db_map = {}
cx_Oracle.init_oracle_client(lib_dir="./instantclient_19_8")
def __init__(self, db_username, db_password, db_type):
self.db_username = db_username
self.db_password = db_password
self.db_type = db_type
self.pool = cx_Oracle.SessionPool( db_username, db_password, db_type,min=1,max=10,increment=0,encoding='UTF-8')
def get_connection(self):
return self.pool.acquire()
def select_from_db(self):
sql = ('SELECT * FROM TT.PMP WHERE TE = "sall"');
connection=self.get_connection()
with connection.cursor() as cursor:
cursor.execute(sql)
connection.commit()
return "executed"
def insert_csv_data(self):
//not sure how to insert data from csv
def config_file_parser(config_file):
global atp_dict_data
ab=[]
config=configparser.ConfigParser()
config.read(config_file)
profile=config.sections()
for config_profile in profile:
func1 = get_work_request(file=config_file, profile_name=config_profile)
#get_print_details(func1)
def get_work_request(file=DEFAULT_CONFIG, profile_name=DEFAULT_PROFILE):
global oci_config, identity_client, work_request_client, atp_dict_data
oci_config = oci.config.from_file(file, profile_name=profile_name)
identity_client = oci.identity.identity_client.IdentityClient(oci_config)
core_client = oci.core.ComputeClient(oci_config)
db_client= oci.database.DatabaseClient(oci_config)
atp_db_details = db_client.list_autonomous_databases(oci_config["compartment"]).data
json_response = json.loads(str(atp_db_details))
for i in json_response:
atp_dict_data.append({'region': oci_config["region"], 'atp_name': i["db_name"], 'ser':oci_config["ser"], 'm_start': i["m_start"], 'm_end': i["m_end"]})
print(atp_dict_data)
keys = atp_dict_data[0].keys()
with open('test.csv', 'w') as output_file:
dict_writer = csv.DictWriter(output_file, keys)
dict_writer.writeheader()
dict_writer.writerows(atp_dict_data)
if __name__ == "__main__":
config_file_parser(config_file)
atp_conn = DbConnect(db_username, db_password, db_type)
atp_conn.__init__
atp_conn.get_connection
atp_conn.select_from_db
Проблемы :
когда я вызываю класс Dbconnect, он даже не выполняет, он просто выполняется до тех пор, пока
atp_conn.__init__
и останавливается.Как мне вставить файл данных csv в базу данных Oracle? Есть ли лучший подход, например, без создания файла csv и непосредственной вставки данных путем чтения из dict (
atp_dict_data
) с использованием мгновенного подключения.
Любая помощь была бы замечательной
1 ответ
Я думаю, вам нужно только добавить код, похожий на тот, который я вам показываю ниже, и инкапсулировать его в вашу функцию.
Имейте в виду, что ниже это всего лишь пример, вы должны адаптировать его к своему конкретному коду.
Самый простой способ использования
csv
import cx_Oracle
import csv
con = cx_Oracle.connect('hr/hrpsw@localhost/orcl')
cur = con.cursor()
with open("mycsvfile.csv", "r") as csv_file:
csv_reader = csv.reader(csv_file, delimiter='|')
# skip first line if header row
next(csv_reader)
for lines in csv_reader:
cur.execute(
"insert into table (field1, field2, ..... , fieldn ) values (:1, :2, ..... , :n)",
(lines[0], lines[1], lines[2], ....., lines[n]))
cur.close()
con.commit()
con.close()
С использованием
pandas
import pandas as pd
import cx_Oracle
my_data = pd.read_csv('mycsvfile')
my_data.head()
from cx_Oracle import DatabaseError
try:
conn = cx_Oracle.connect('yourconnectiondetails')
if conn:
cursor = conn.cursor()
for i,row in my_data.iterrows():
sql = "INSERT INTO table (field1, field2, ..... , fieldn ) values (:1, :2, ..... , :n)"
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 succesfully")
except DatabaseError as e:
err, = e.args
print("Oracle-Error-Code:", err.code)
print("Oracle-Error-Message:", err.message)
finally:
cursor.close()
conn.close()