[英]Flask-MySQL How to effectively INSERT INTO table with parameterized queries
[英]How to insert data from CSV to MySQL without using parameterized queries?
我使用巨大的 CSV 數據文件,並計划在使用 Python 將數據逐行插入 MySQL 之前進行一些檢查。 由於數據文件非常大,打開文件需要花費大量時間。 因此,我的目標是在不手動分析它們的情況下加載它們。 我將使用 Python 為我進行分析。 我已經開始編寫代碼,但在插入數據時卡住了。 我確定這是一個基本問題並且無法弄清楚,因為我對 Python 有點陌生。 演示數據:
id,first_name,last_name,email,boole,coin
1,Emilio,Pettie,epettie0@craigslist.org,true,1Lj8Z4Em68hwqRAUXZKW7C7h2KgH5cGpTe
2,Raynard,Fairholme,rfairholme1@wisc.edu,true,1AEwLuECKYD1Bb6EGaBQC1TJS1mtvHBmy3
3,Zonda,Bampkin,zbampkin2@google.nl,false,14AHvnRjXExdgfqZBnWUyVi7aWZR8SFBoL
4,Thurstan,Sherville,tsherville3@umich.edu,true,19iiiJ53zxmJnbmW7gKH2hoMwpiaqkit8E
5,Jonathan,Jewkes,jjewkes4@nba.com,false,18E22TTK68ukQVLWK6oZNfFbzP2uHqaW7o
6,Dolores,Carmichael,dcarmichael5@blogtalkradio.com,false,15BBePy5J3WY1QQLTjA79iYQMjDRubv2BD
7,Kleon,Wesker,kwesker6@buzzfeed.com,false,1NfYtAuq6M3cXGhDJuDBnCjdEBRSKsfRVJ
8,Laureen,Writtle,lwrittle7@tripadvisor.com,true,14UgbrWz9wi2UptALs2dFeQRdUiMaLee57
9,Gypsy,Coombes,gcoombes8@home.pl,true,1Hn3JBtjytwbBMVJgM7ixAi1sXf56KFM3R
10,Kevina,Boulger,kboulger9@sakura.ne.jp,false,1GABbcoRTVsX1qzD8uiGtsPtuD1kvzokK1
編碼 :
import string
import csv
import mysql.connector
mydb=mysql.connector.connect(host="localhost",user="root",password="password",autocommit=True)
mycursor = mydb.cursor()
sql_str=''
sql_str1=''
mycursor.execute("drop table if exists rd.data")
with open(r"C:\Users\rcsid\Documents\Office Programs\Working prog\MOCK_DATA.csv") as csvfile:
csv_reader = csv.DictReader(csvfile)
line_count = 0
for row in csv_reader:
if line_count == 0:
sql_str=f'create table rd.data ( {" varchar(50), ".join(row)} varchar(50))'
mycursor.execute(sql_str)
sql_str1=f'insert into rd.data values ( {", ".join(row)})'
print(sql_str1)
mycursor.execute(sql_str1)
line_count += 1
我能夠創建表格和標題部分。 但是我無法加載數據。 print(sql_str1)
輸出是:
insert into rd.data values ( id, first_name, last_name, email, boole, coin)
insert into rd.data values ( id, first_name, last_name, email, boole, coin)
insert into rd.data values ( id, first_name, last_name, email, boole, coin)
insert into rd.data values ( id, first_name, last_name, email, boole, coin)
對於所有值,插入的數據都是空的。 你能告訴我如何在csv中捕獲數據嗎? 我知道這可能是一種基本語法。 我也知道語法cur.execute('INSERT INTO table (columns) VALUES(%s, ....)', row)
但不想使用它,因為我需要打開文件來檢查標題部分。
我不認為你應該想不使用參數化查詢一個很好的理由。 您已經知道 CSV 標題中的列名(並且您可能總是知道這一點,否則您將如何創建表?),那么為什么不按照推薦的方式來做呢? 當您with open...
並使用DictReader
逐行閱讀時,您已經打開了文件。 盡管它不是面向公眾的代碼,但如果您的 CSV 中有類似 SQL 注入的元素,您的數據庫可能會損壞。
DictReader
讀取該行作為字典。 當你遍歷字典時,你得到的是它的鍵而不是它的值。 另外,請記住,您想將這些插入到 varchar 列中,因此您需要將它們括在'
你需要做
col_vals = ", ".join([f"'{v}'" for v in row.values()])
sql_str1=f'insert into rd.data values ({colvals})'
我強烈建議您使用如下參數進行操作:
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())
因為您使用csv.DictReader
您可以輕松地從字典鍵中檢索列。 事實上,這個方法會跳過第一行。 此外,考慮僅對兩個游標調用進行參數化的executemany
:
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()
在線演示(使用 SQLite 但應與 MySQL 保持一致)
我能夠使用以下代碼解決問題:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.