一、概述
在Python的資料庫編程中,我們經常會用到的是cursor.execute(sql)這個函數,它用來執行SQL語句,並且返回受影響的行數。它是Python DB-API規範所要求實現的一個方法。在這篇文章中,我們將圍繞這個方法,從以下幾個方面進行講解:
二、參數
cursor.execute()函數的參數是SQL語句。這個語句可以是一個字元串變數或是直接寫到函數里的,具體可以看下面的示例:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="yourusername",
password="yourpassword",
database="mydatabase"
)
mycursor = mydb.cursor()
sql = "INSERT INTO customers (name, address) VALUES (%s, %s)"
val = ("John", "Highway 21")
mycursor.execute(sql, val)
mydb.commit()
print(mycursor.rowcount, "record inserted.")
在這個例子中,我們使用了mysql.connector這個庫來連接MySQL資料庫,同時用cursor()方法定義了游標對象mycursor。使用了一條SQL語句INSERT INTO來新增一條數據到資料庫表格customers中。
在游標對象mycursor上,我們調用了execute()方法並且傳入了sql和val兩個參數。其中sql是一個SQL語句字元串,val是一個元組。這裡使用了?作為佔位符,那麼就要按照?的順序傳入後面的數據。
三、執行結果
在執行完cursor.execute()方法後,我們可以調用一些其他的方法來獲取執行結果。
1、調用rowcount屬性可以獲取受影響的行數,例如:
mycursor.execute("SELECT * FROM customers")
myresult = mycursor.fetchall()
print("Number of rows in customers is: ", mycursor.rowcount)
2、調用fetchone()、fetchmany()或者fetchall()方法,分別返回一條、多條或所有數據。
例如,下面的代碼會返回所有customers表的數據:
mycursor.execute("SELECT * FROM customers")
myresult = mycursor.fetchall()
for x in myresult:
print(x)
四、防止SQL注入
SQL注入攻擊是資料庫編程中的一個比較棘手的問題。如果我們在構造SQL語句的時候,不小心將來自用戶輸入的數據拼接進去,那麼就存在被攻擊的風險。為了防止這種情況的發生,我們需要使用參數化查詢而不是直接拼接字元串。而參數化查詢就是在SQL語句中使用佔位符,然後將參數傳入到函數中來進行替換。比如:
sql = "SELECT * FROM customers WHERE address = %s"
adr = ("Yellow Garden 2", )
mycursor.execute(sql, adr)
在這個例子中,我們在SQL語句中使用了一個佔位符%s。在調用execute()方法時,我們將指定的元組傳入到方法中,作為替換佔位符的參數。這樣,即使從用戶輸入的數據中截取了字元串,也不會造成SQL注入的問題。
五、批量操作
在Python中,我們也可以使用executemany()方法對多條SQL語句進行批處理。方法的使用方式與execute()類似,只不過需要傳入的數據不同而已。比如:
sql = "INSERT INTO customers (name, address) VALUES (%s, %s)"
val = [
('Peter', 'Lowstreet 4'),
('Amy', 'Apple st 652'),
('Hannah', 'Mountain 21'),
('Michael', 'Valley 345'),
('Sandy', 'Ocean blvd 2'),
('Betty', 'Green Grass 1'),
('Richard', 'Sky st 331'),
('Susan', 'One way 98'),
('Vicky', 'Yellow Garden 2'),
('Ben', 'Park Lane 38'),
('William', 'Central st 954'),
('Chuck', 'Main Road 989'),
('Viola', 'Sideway 1633')
]
mycursor.executemany(sql, val)
mydb.commit()
print(mycursor.rowcount, "was inserted.")
在這個例子中,我們使用了一個包含多個元組的列表val。在調用executemany()方法時,我們將sql和這個元組列表作為參數傳入。這樣就可以批量地插入多個數據。
原創文章,作者:ABXC,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/146072.html