插入多行
要將多行插入到表中,使用executemany()方法。
executemany()方法的第二個參數是一個元組列表,包含了要插入的數據:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="你的用戶名",
passwd="你的密碼",
database="mydatabase"
)
mycursor = mydb.cursor()
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, " 條已經插入")
獲取插入行的ID
可以通過查詢cursor對象,獲得剛才插入行的id。
注意: 如果插入多行,則返回最后插入行的id。
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="你的用戶名",
passwd="你的密碼",
database="mydatabase"
)
mycursor = mydb.cursor()
sql = "INSERT INTO customers (name, address) VALUES (%s, %s)"
val = ("Michelle", "Blue Village")
mycursor.execute(sql, val)
mydb.commit()
print("1 條記錄插入, ID:", mycursor.lastrowid)
防止SQL注入
當用戶提供查詢值時,為了防止SQL注入,應該轉義這些值。
SQL注入是一種常見的web黑客技術,用於破壞或誤用數據庫。
mysql.connector 模塊有方法可以轉義查詢值:
示例
使用占位符%s方法轉義查詢值:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="你的用戶名",
passwd="你的密碼",
database="mydatabase"
)
mycursor = mydb.cursor()
sql = "SELECT * FROM customers WHERE address = %s"
adr = ("Yellow Garden 2", )
mycursor.execute(sql, adr)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
ORDER BY DESC
使用DESC關鍵字,可按降序對結果排序。
示例
按name的字母降序,對結果進行排序:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="你的用戶名",
passwd="你的密碼",
database="mydatabase"
)
mycursor = mydb.cursor()
sql = "SELECT * FROM customers ORDER BY name DESC"
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
刪除記錄
可以使用“DELETE FROM”語句,從現有表中刪除記錄:
示例
刪除地址為“Mountain 21”的記錄:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="你的用戶名",
passwd="你的密碼",
database="mydatabase"
)
mycursor = mydb.cursor()
sql = "DELETE FROM customers WHERE address = 'Mountain 21'"
mycursor.execute(sql)
mydb.commit()
print(mycursor.rowcount, " 條記錄刪除")
注意: 數據庫修改后,需要使用mydb.commit()語句提交,不提交,修改不會生效。
注意DELETE語句中的WHERE子句: WHERE子句指定應該刪除哪些記錄。如果省略WHERE子句,將刪除所有記錄!
僅當表存在時才刪除
如果要刪除的表不存在,會報錯,可以使用If EXISTS關鍵字判斷表是否存在,避免報錯。
示例
刪除存在的表“customers”:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="你的用戶名",
passwd="你的密碼",
database="mydatabase"
)
mycursor = mydb.cursor()
sql = "DROP TABLE IF EXISTS customers"
mycursor.execute(sql)
更新表
可以使用“UPDATE”語句,更新表格內的現有記錄:
示例
將地址欄由“Valley 345”改寫為“Canyoun 123”:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="你的用戶名",
passwd="你的密碼",
database="mydatabase"
)
mycursor = mydb.cursor()
sql = "UPDATE customers SET address = 'Canyon 123' WHERE address = 'Valley 345'"
mycursor.execute(sql)
mydb.commit()
print(mycursor.rowcount, " 條記錄已更新")
注意: 數據庫修改后,需要使用mydb.commit()語句提交,不提交,修改不會生效。
注意UPDATE語句中的WHERE子句: WHERE子句指定應該更新哪些記錄。如果省略WHERE子句,將更新所有記錄!
防止SQL注入
在update語句中,為了防止SQL注入,通常應該轉義查詢值。
SQL注入是一種常見的web黑客技術,用於破壞或誤用數據庫。
mysql.connector 模塊有方法可以轉義查詢值:
示例
使用占位符%s方法轉義查詢值:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="你的用戶名",
passwd="你的密碼",
database="mydatabase"
)
mycursor = mydb.cursor()
sql = "UPDATE customers SET address = %s WHERE address = %s"
val = ("Valley 345", "Canyon 123")
mycursor.execute(sql, val)
mydb.commit()
print(mycursor.rowcount, " 條記錄已更新")
限制結果數量
可以使用“LIMIT”語句,限制查詢返回的記錄數量:
示例
在“customers”表中,選擇前5條記錄:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="你的用戶名",
passwd="你的密碼",
database="mydatabase"
)
mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM customers LIMIT 5")
myresult = mycursor.fetchall()
for x in myresult:
print(x)
從指定位置開始
如果想返回,從第3條記錄開始的5條記錄,可以使用“OFFSET”關鍵字:
示例
從位置3開始,返回5條記錄:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="你的用戶名",
passwd="你的密碼",
database="mydatabase"
)
mycursor = mydb.cursor()
mycursor.execute("SELECT * FROM customers LIMIT 5 OFFSET 2")
myresult = mycursor.fetchall()
for x in myresult:
print(x)
連接兩個或多個表
可以使用JOIN語句,根據多張表之間的相關字段,把這些表組合成一個表。
假設有一個“users”表和一個“products”表:
users
{ id: 1, name: 'John', fav: 154},
{ id: 2, name: 'Peter', fav: 154},
{ id: 3, name: 'Amy', fav: 155},
{ id: 4, name: 'Hannah', fav:},
{ id: 5, name: 'Michael', fav:}
products
{ id: 155, name: 'Tasty Lemons' },
{ id: 156, name: 'Vanilla Dreams' }
可以使用用戶的fav字段和產品的id字段,組合這兩個表。
示例
連接users表與products表,查看用戶喜歡的產品:
import mysql.connector
mydb = mysql.connector.connect(
host="localhost",
user="你的用戶名",
passwd="你的密碼",
database="mydatabase"
)
mycursor = mydb.cursor()
sql = "SELECT \
users.name AS user, \
products.name AS favorite \
FROM users \
INNER JOIN products ON users.fav = products.id"
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
注意: JOIN與INNER JOIN等價,它們會給你相同的結果。
左連接
在上面的例子中,Hannah和Michael被排除在結果之外,這是因為INNER JOIN只顯示匹配的記錄。
如果想顯示所有用戶,即使他們沒有喜歡的產品,可以使用LEFT JOIN語句:
示例
查詢所有用戶和他們喜歡的產品:
sql = "SELECT \
users.name AS user, \
products.name AS favorite \
FROM users \
LEFT JOIN products ON users.fav = products.id"
右連接
如果你想要返回所有產品,以及喜歡它們的用戶,可以使用RIGHT JOIN語句:
示例
查詢所有產品以及喜歡它們的用戶:
sql = "SELECT \
users.name AS user, \
products.name AS favorite \
FROM users \
RIGHT JOIN products ON users.fav = products.id"
注: Hannah 與 Michael,沒有喜歡的產品,被排除在結果之外。