pymysql操作mysql
安裝,啟動及鏈接
MySQL
-
安裝mysql:
sudo apt-get install -y mysql-server mysql-client -
啟動、關閉和重啟MySQL服務:
sudo service mysql start
sudo service mysql stop
sudo service mysql restart
sudo service mysql status:查看狀態
netstat -an|grep 3306:查看mysql是否啟動成功,監聽3306端口
pymysql
- GitHub:https://github.com/PyMySQL/PyMySQL
- 官方文檔:http://pymysql.readthedocs.io/
- PyPI:https://pypi.python.org/pypi/PyMySQL
安裝pymysql:
pip3 install pymysql
鏈接數據庫
鏈接之前,要啟動mysql
import pymysql # 1.導入pymysql包
db = pymysql.connect(host='localhost', user='root',
password='123456',port=3306) # 2.聲明一個MySQL連接對象db,在遠程host傳入其公網ip
cursor =db.cursor() # 3.獲得操作游標
cursor.execute('SELECT VERSION()') # 4.通過游標進行操作,execute()執行sql語句
data = cursor.fetchone() # 獲得第一條數據
print('Database version:', data)
cursor.execute("CREATE DATABASE spiders DEFAULT CHARACTER SET utf8") # 創建數據庫,默認utf-8編碼
db.close() # 5.關閉連接
創建表
創建數據庫后,在連接時需要額外指定一個參數db
import pymysql
db = connect(host='localhost', user='root',
password='123456', port=3306, db='spiders') #創建數據庫后,在連接時需要額外指定一個參數db
cursor = db.cursor()
cursor.execute('CREAT TABLE IF NOT EXISTS students (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, age INT NOT NULL, PRIMARY KEY (id))')
db.close()
事務性ACID
| 屬性 | 解釋 |
|---|---|
| 原子性(atomicity) | 事務是一個不可分割的工作單位,事務中包括的諸操作要么都做,要么都不做 |
| 一致性(consistency) | 事務必須使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的 |
| 隔離性(isolation) | 一個事務的執行不能被其他事務干擾,即一個事務內部的操作及使用的數據對並發的其他事務是隔離的,並發執行的各個事務之間不能互相干擾 |
| 持久性(durability) | 持續性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響 |
- 更改操作(增刪改)事務性標准寫法:
try:
cursor.execute(sql)
cursor.commit() # 提交,數據才被真正寫到了數據庫中
except:
db.rollback() # 回滾操作,相當與沒有進行操作
插入數據
- sql語法:
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
- python操作
# 封裝了sql語句和插入操作
data = {
'id': '2012001',
'name': 'Bob',
'age':20
}
table = 'students'
keys = ','.join(data.keys())
values = ', '.join(['%s'] * len(data))
sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values)
try:
if cursor.execute(sql, tuple(data.values())):
print('Successful')
db.commit()
except:
print('Failed')
db.rollback()
db.close()
更新數據
- sql語法
UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
- python操作
# 一種去重的方法,如果數據存在,則更新數據;如果數據不存在,則插入數據
data = {
'id': '20120001',
'name': 'Bob',
'age': 21
}
table = 'students'
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))
sql = 'INSERT INTO {table}({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE'.format(table=table, keys=keys, values=values)
update = ','.join([" {key} = %s".format(key=key) for key in data])
sql += update
try:
if cursor.execute(sql, tuple(data.values())*2):
print('Successful')
db.commit()
except:
print('Failed')
db.rollback()
db.close()
ON DUPLICATE KEY UPDATE:意思是如果主鍵已經存在,就執行更新操作
完整的SQL構造出來是:INSERT INTO students(id, name, age) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE id = %s, name = %s, age = %s所以execute()方法的第二個參數元組就需要乘以2變成原來的2倍
刪除數據
- sql語法
DELETE FROM table_name [WHERE Clause]
- python操作
# 將條件當作字符串來傳遞,以實現刪除操作
table = 'students'
condition = 'age > 20'
sql = 'DELETE FROM {table} WHERE {condition}'.format(table=table, condition=condition)
try:
cursor.execute(sql)
db.commit()
except:
db.rollback()
db.close()
查詢操作
- sql語法
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
- python操作
cursor.execute(sql)
print('Count:', cursor.rowcount) # rowcount屬性獲取查詢結果的條數
one = cursor.fetchone() # fetchone()方法,這個方法可以獲取結果的第一條數據,返回結果是元組形式
print('One:', one)
results = cursor.fetchall() # fetchall()方法返回的是偏移指針指向的數據一直到結束的所有數據
