08、python操作mysql
阿新 • • 發佈:2022-05-12
一、python連線資料庫
import pymysql
db = pymysql.connect("資料庫ip","使用者","密碼","資料庫" ) # 開啟資料庫連線
cursor.execute("SELECT VERSION()") # 使用 execute() 方法執行 SQL 查詢
data = cursor.fetchone() # 使用 fetchone() 方法獲取單條資料
print ("Database version : %s " % data)
db.close() # 關閉資料庫連線
import pymysql
conn = pymysql.connect(
host='localhost',
user='root',
password="root",
database='db',
port=3306, charset='utf-8',
)
cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
二、建立表操作
import pymysql
# 開啟資料庫連線
db = pymysql.connect(
"localhost",
"testuser",
"test123",
"TESTDB"
)
# 使用 cursor() 方法建立一個遊標物件 cursor
cursor = db.cursor()
# 使用 execute() 方法執行 SQL,如果表存在則刪除
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
# 使用預處理語句建立表
sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""
cursor.execute(sql)
# 關閉資料庫連線
db.close()
三、操作資料
1、插入操作
import pymysql
# 開啟資料庫連線
db = pymysql.connect(
"localhost",
"testuser",
"test123",
"TESTDB"
)
# 使用cursor()方法獲取操作遊標
cursor = db.cursor()
# SQL 插入語句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
cursor.execute(sql) # 執行sql語句
db.commit() # 提交到資料庫執行
except:
db.rollback() # 如果發生錯誤則回滾
# 關閉資料庫連線
db.close()
import pymysql
# 開啟資料庫連線
db = pymysql.connect(
"localhost",
"testuser",
"test123",
"TESTDB"
)
# 使用cursor()方法獲取操作遊標
cursor = db.cursor()
# SQL 插入語句
sql = "INSERT INTO EMPLOYEE(FIRST_NAME, \
LAST_NAME, AGE, SEX, INCOME) \
VALUES (%s, %s, %s, %s, %s )" % \
('Mac', 'Mohan', 20, 'M', 2000)
try:
cursor.execute(sql) # 執行sql語句
db.commit() # 執行sql語句
except:
db.rollback() # 發生錯誤時回滾
# 關閉資料庫連線
db.close()
2、查詢操作
Python查詢Mysql使用 fetchone() 方法獲取單條資料, 使用fetchall() 方法獲取多條資料。
-
fetchone(): 該方法獲取下一個查詢結果集。結果集是一個物件
-
fetchall(): 接收全部的返回結果行.
-
rowcount: 這是一個只讀屬性,並返回執行execute()方法後影響的行數。
import pymysql
# 開啟資料庫連線
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# 使用cursor()方法獲取操作遊標
cursor = db.cursor()
# SQL 查詢語句
sql = "SELECT * FROM EMPLOYEE \
WHERE INCOME > %s" % (1000)
try:
cursor.execute(sql)# 執行SQL語句
results = cursor.fetchall()# 獲取所有記錄列表
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# 列印結果
print ("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
(fname, lname, age, sex, income ))
except:
print ("Error: unable to fetch data")
# 關閉資料庫連線
db.close()
3、更新操作
import pymysql
# 開啟資料庫連線
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# 使用cursor()方法獲取操作遊標
cursor = db.cursor()
# SQL 更新語句
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
try:
cursor.execute(sql) # 執行SQL語句
db.commit() # 提交到資料庫執行
except
db.rollback() # 發生錯誤時回滾
# 關閉資料庫連線
db.close()
4、刪除操作
import pymysql
# 開啟資料庫連線
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# 使用cursor()方法獲取操作遊標
cursor = db.cursor()
# SQL 刪除語句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
try
cursor.execute(sql) # 執行SQL語句
db.commit() # 提交修改
except
db.rollback() # 發生錯誤時回滾# 關閉連線
db.close()
四、資料備份
1、資料庫的邏輯備份
#語法: # mysqldump -h 伺服器 -u使用者名稱 -p密碼 資料庫名 > 備份檔案.sql #示例: #單庫備份 mysqldump -uroot -p123 db1 > db1.sql mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql #多庫備份 mysqldump -uroot -p123 --databases db1 db2 mysql db3 > db1_db2_mysql_db3.sql #備份所有庫 mysqldump -uroot -p123 --all-databases > all.sql
2、資料恢復
#方法一: [root@jason backup]# mysql -uroot -p123 < /backup/all.sql #方法二: mysql> use db1; mysql> SET SQL_LOG_BIN=0; #關閉二進位制日誌,只對當前session生效 mysql> source /root/db1.sql
五、事務和鎖
begin; # 開啟事務 select * from emp where id = 1 for update; # 查詢id值,for update新增行鎖; update emp set salary=10000 where id = 1; # 完成更新 commit; # 提交事務
###
六、python操作MySQL
python 膠水語言、調包俠(貶義詞>>>褒義詞) """ python這門語言本身並不牛逼 牛逼的是支援該語言的各種功能強大的模組、軟體 """ # 後期在使用python程式設計的時候 很多看似比較複雜功能可能都已經有相應的模組 模組名字 pymysql 下載模組 1.命令列 pip3 install pymysql pip3 install pymysql -i 源地址 2.藉助於pycharm 3.python直譯器配置檔案
1、模組基本使用
import pymysql # 建立連結 conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123', database='db_5', charset='utf8' ) # 生成一個遊標物件 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 讓資料自動組織成字典 # 定義SQL語句 sql = 'select * from userinfo' # 執行SQL語句 cursor.execute(sql) # 獲取返回結果 res = cursor.fetchall() print(res)
2、SQL注入問題
import pymysql # 建立連結 conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123', database='db_5', charset='utf8' ) # 生成一個遊標物件 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 讓資料自動組織成字典 # 獲取使用者名稱和密碼 username = input('username>>>:').strip() password = input('password>>>:').strip() # 構造SQL語句 # sql = "select * from userinfo where name='%s' and password='%s'"%(username,password) # 針對核心資料 不要自己拼接 交由execute方法幫你篩選再拼接 sql = "select * from userinfo where name=%s and password=%s" print(sql) # 執行SQL語句 cursor.execute(sql,(username,password)) res = cursor.fetchall() if res: print(res) print('登入成功') else: print('使用者名稱或密碼錯誤') """ 登入功能 1.獲取使用者名稱和密碼 2.基於使用者名稱和密碼直接精準查詢 """ """ 問題1 使用者名稱正確 不需要密碼也能登入 問題2 使用者名稱和密碼都不需要也能登入 SQL注入問題的產生 就是通過一些特殊符號的組合 達到某些特定的效果從而避免常規的邏輯 SQL注入問題如何解決 execute方法自動幫你解決 """
3、功能補充
import pymysql # 建立連結 conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123', database='db_5', charset='utf8', autocommit=True # 涉及到增刪改 自動二次確認 ) # 生成一個遊標物件 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 讓資料自動組織成字典 sql1 = 'select * from userinfo' sql2 = 'insert into userinfo(name,password) values(%s,%s)' sql3 = 'update userinfo set name="jasonNB" where id=1' sql4 = 'delete from userinfo where id=2' # 1.查詢語句可以正常執行並獲取結果 # cursor.execute(sql1) # 2.插入語句能夠執行 但是並沒有影響表資料 # cursor.execute(sql2,('jackson',666)) # 3.更新語句能夠執行 但是並沒有影響表資料 # res = cursor.execute(sql3) # print(res) # 4.刪除語句能夠執行 但是並沒有影響表資料 # res = cursor.execute(sql4) # print(res) '''針對增刪改操作 需要二次確認才可生效''' # cursor.execute(sql2,('jackson',666)) # conn.commit() # cursor.execute(sql3) # conn.commit() # cursor.execute(sql4) # conn.commit() cursor.executemany(sql2,[('jason111',123),('jason222',321),('jason333',222)]) # 主動關閉連結 釋放資源 # conn.close()
4、註冊登入功能
def register(cursor): # 獲取使用者名稱和密碼 username = input('username>>>:').strip() password = input('password>>>:').strip() # 驗證使用者名稱是否已存在 sql = 'select * from userinfo where name=%s' cursor.execute(sql, (username,)) res = cursor.fetchall() if not res: sql1 = 'insert into userinfo(name,password) values(%s,%s)' cursor.execute(sql1, (username, password)) print('使用者:%s註冊成功' % username) else: print('使用者名稱已存在') def login(cursor): # 獲取使用者名稱和密碼 username = input('username>>>:').strip() password = input('password>>>:').strip() # 先獲取是否存在使用者名稱相關的資料 sql = 'select * from userinfo where name=%s' cursor.execute(sql, (username,)) res = cursor.fetchall() # 得到一個列表套字典 if res: # 校驗密碼 real_dict = res[0] if password == str(real_dict.get('password')): # 密碼的型別為整形 print('登入成功') else: print('密碼錯誤') else: print('使用者名稱不存在') def get_conn(): import pymysql # 建立連結 conn = pymysql.connect( host='127.0.0.1', port=3306, user='root', password='123', database='db_5', charset='utf8', autocommit=True # 涉及到增刪改 自動二次確認 ) # 生成一個遊標物件 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 讓資料自動組織成字典 return cursor func_dic = {'1': register, '2': login} while True: print(""" 1.註冊功能 2.登入功能 """) cursor = get_conn() choice = input('請輸入功能編號>>>:').strip() if choice in func_dic: func_name = func_dic.get(choice) func_name(cursor) else: print('暫時沒有當前功能編號')
作業
1.整理今日內容並完成部落格編寫 2.熟練完成多表查詢練習題(課上五道題必須搞會) 3.註冊登入功能必須脫稿完成