簡體   English   中英

使用 Python - 如何解析整數和字符串的 CSV 列表並通過插入語句添加到 SQL 表?

[英]Using Python - How can I parse CSV list of both integers and strings and add to SQL table through Insert Statement?

我正在通過 Python 自動執行一項任務,該任務將運行 SQL 語句以插入數據庫中的現有表。

我的 CSV 標頭如下所示:

ID,ACCOUNTID,CATEGORY,SUBCATEGORY,CREATION_DATE,CREATED_BY,REMARK,ISIMPORTANT,TYPE,ENTITY_TYPE

我的價值觀:

seq_addnoteid.nextval,123456,TEST,ADMN_TEST,sysdate,ME,這是一個測試,Y,1,A

注意:目前, seq_addnote 從 DB 工作,但在我的代碼中,我添加了一個小片段來獲取最大 ID,並且每次迭代的行將增加一個。

Sysdate 也可以作為格式 '19-MAY-22' 傳遞

如果我要從數據庫運行,這將起作用:

insert into notes values(seq_addnoteid.nextval,'123456','TEST','ADMN_TEST',sysdate,'ME','This is a test','Y',1,'A');

    # Snippet to get function
    cursor.execute("SELECT MAX(ID) from NOTES")
    max = cursor.fetchone()
    max = int(max[0])

    
    with open ('sample.csv', 'r') as f:
        reader = csv.reader(f)
        columns = next(reader)
        query = 'INSERT INTO NOTES({0}) values ({1})'
        query = query.format(','.join(columns), ','.join('?' * len(columns)))
        cursor = conn.cursor()
        for data in reader:
            cursor.execute(query, data)
        conn.commit()
        print("Records inserted successfully")
    cursor.close()
    conn.close()

目前,我收到Oracle-Error-Message: ORA-01036: illegal variable name/number ,我認為這是因為我的query.format行。 但是,我正在尋求幫助以使此代碼正確處理數據類型。

謝謝!

在執行之前嘗試打印查詢。 我想你會發現它正在打印這個:

INSERT INTO NOTES(ID,ACCOUNTID,CATEGORY,SUBCATEGORY,CREATION_DATE,CREATED_BY,REMARK,ISIMPORTANT,TYPE,ENTITY_TYPE) 
values(seq_addnoteid.nextval,123456,TEST,ADMN_TEST,sysdate,ME,This is a test,Y,1,A);

如果您嘗試手動運行它,它也會給您一個 ORA-01036。

問題是您希望您的一些列值是文字值,其中一些是在單引號中轉義的字符串,而您的代碼不會這樣做。 我認為使用','.join()沒有簡單的方法,因此您需要修改 CSV 以引用字符串,例如:

seq_addnoteid.nextval,"'123456'","'TEST'","'ADMN_TEST'",sysdate,"'ME'","'This is a test'","'Y'",1,"'A'"

或者修改您的 query.format 以在要視為字符串的參數周圍添加引號:

query.format(','.join(columns), "?,'?','?','?',?,'?','?','?',?,'?'")

正如評論者所提到的,熊貓確實很好地處理了這一切。

編輯:我明白你在說什么。 我不確定 pandas 是否會幫助您處理要傳遞給插入的文字函數。 但是,是的,您應該能夠更改 CSV,然后執行以下操作:

query.format(','.join(columns) + ',ID,CREATION_DATE', "'?','?','?','?','?','?',?,'?',seq_addnoteid.nextval,sysdate")

作為旁注,很多人在 BEFORE INSERT 觸發器中在數據庫端做這種事情,例如:

create or replace trigger NOTES_INS_TRG
before insert on NOTES
for each row 
begin

:NEW.ID := seq_addnoteid.nextval;
:NEW.CREATION_DATE := sysdate;

end;
/

然后,您可以將這些列完全排除在插入之外。

再次編輯:

我不確定你能用? 用於 cx_oracle 中的綁定/替換變量(請參閱文檔)。 因此,您的原始查詢當前在哪里:

INSERT INTO NOTES(ACCOUNTID,CATEGORY,SUBCATEGORY,CREATED_BY,REMARK,ISIMPORTANT,TYPE,ENTITY_TYPE,ID,CREATION_DATE) 
values (seq_addnoteid.nextval,sysdate,'?','?','?','?','?','?',?,'?')

你需要類似的東西:

INSERT INTO NOTES(ACCOUNTID,CATEGORY,SUBCATEGORY,CREATED_BY,REMARK,ISIMPORTANT,TYPE,ENTITY_TYPE,ID,CREATION_DATE) 
values (seq_addnoteid.nextval,sysdate,:1,:2,:3,:4,:5,:6,:7,:8)

我們可以通過再次修改格式字符串來生成一些綁定變量來做到這一點:

query.format('ID,CREATION_DATE,' + ','.join(columns), 
             "seq_addnoteid.nextval,sysdate," + ','.join([':'+c for c in columns])

同樣,在執行之前嘗試打印查詢,以確保列名和值正確排列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM