3 回答

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
我想不出您不應(yīng)該使用參數(shù)化查詢的充分理由。您已經(jīng)知道 CSV 標(biāo)題中的列名稱(并且您可能總是知道這一點(diǎn),否則您將如何創(chuàng)建表?),那么為什么不按照推薦的方式進(jìn)行操作呢?當(dāng)您這樣做時(shí),您已經(jīng)打開了該文件with open...
并使用DictReader
.?盡管它不是面向公眾的代碼,但如果 CSV 中存在類似 SQL 注入的元素,您的數(shù)據(jù)庫(kù)可能會(huì)崩潰。
DictReader
作為字典讀取該行。當(dāng)您迭代字典時(shí),您得到的是它的鍵而不是它的值。另外,請(qǐng)記住,您想要將它們插入到 varchar 列中,因此您需要將它們括在'
你需要做
col_vals = ", ".join([f"'{v}'" for v in row.values()])
sql_str1=f'insert into rd.data values ({colvals})'
我強(qiáng)烈建議您使用如下參數(shù)來執(zhí)行此操作:
col_names = ",".join(row) # 'id,first_name,last_name,email,boole,coin'
params = ",".join("%s" for x in row) # '%s,%s,%s,%s,%s,%s'
query = f'insert into rd.data ({col_names}) values ({params})'
mycursor.execute(query, row.values())

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
因?yàn)槟?code>csv.DictReader可以輕松地從字典鍵中檢索列。事實(shí)上,此方法會(huì)跳過第一行。此外,請(qǐng)考慮executemany
僅對(duì)兩個(gè)游標(biāo)調(diào)用進(jìn)行參數(shù)化:
with open(r"C:\Path\To\MOCK_DATA.csv") as csvfile:
? ? csv_reader = csv.DictReader(csvfile)
? ? data = [row for row in csv_reader]
? ??
? ? sql1 = f'CREATE TABLE rd.data ( {" VARCHAR(50), ".join(data[0].keys())} VARCHAR(50))'
? ? mycursor.execute(sql1)
? ? mydb.commit()
? ? sql2 = "INSERT INTO rd.data (`{cols}`) VALUES ({prms})"
? ? sql2 = sql2.format(cols="`, `".join(data[0].keys()),?
? ? ? ? ? ? ? ? ? ? ? ?prms=", ".join(['%s'] * len(data[0])))??
? ??
? ? mycursor.executemany(sql2, [list(d.values()) for d in data])
? ? mydb.commit()
Online Demo?(使用 SQLite 但應(yīng)與 MySQL 保持一致)

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊
我能夠使用以下代碼解決該問題:
mycursor.execute("drop table if exists rd.data_with_header")
#r"C:\Users\rcsid\Documents\Office Programs\Working prog\MOCK_DATA.csv"
#re.sub('[^a-zA-Z0-9]\n\.', '_', row)
reader = csv.DictReader(open(r"C:\Users\rcsid\Documents\Office Programs\Working prog\MOCK_DATA.csv",encoding='utf-8',errors='ignore'), delimiter=',')
rowHeaders = reader.fieldnames
print(rowHeaders)
for i in rowHeaders:
field_name.append(re.sub('[^A-Za-z0-9]+', '_', i))
print(field_name)
print(f'''create table rd.data_with_header ( {" varchar(100), ".join(field_name)} varchar(100))''')
sql_str=f'''create table rd.data_with_header ( {" varchar(100), ".join(field_name)} varchar(100))'''
mycursor.execute(sql_str)
for row in reader:
sql_str1=f'''insert into rd.data values ('{"',' ".join(row.values())}')'''
print(sql_str1)
mycursor.execute(sql_str1)
添加回答
舉報(bào)