Mysql 數據庫操做查詢記錄

插入多行

要將多行插入到表中,使用executemany()方法。
executemany()方法的第二個參數是一個元組列表,包含了要插入的數據:mysql

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。web

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

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的字母降序,對結果進行排序:ide

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」的記錄:fetch

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子句,將刪除全部記錄!code

僅當表存在時才刪除

若是要刪除的表不存在,會報錯,能夠使用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,沒有喜歡的產品,被排除在結果以外。

相關文章
相關標籤/搜索