Python全棧 MySQL 數據庫 (引擎、事物、pymysql模塊、orm)

ParisGabriel
 
 
         天天堅持手寫  一天一篇  決定堅持幾年 爲了夢想爲了信仰
 
   開局一張圖
 
 
存儲引擎(處理表的處理器)
    基本操做:
        查看全部存儲引擎
          show engines;
        查看已有表的存儲引擎
  show create table 表名;
建立表指定引擎
  create table 表名()engine=myisam;
已有表添加引擎
  alter table 表名 engine=innodb;
MySQL鎖:(自動加鎖)
  目的:解決客戶端併發訪問的衝突問題
  鎖分類:
     類型:
        1.讀鎖(共享鎖)
  select :加讀鎖後別人不能更改表記錄,但能夠查詢
2.寫鎖(互次鎖、排他鎖)
          insert、delete、update
  加寫鎖後別人不能查也不能改
     鎖粒度:
        1.表級鎖:myisam
1.行級鎖:innodb
經常使用的存儲引擎特色
  InnoDB特色:
     1.共享表空間
       表名.frm:表結構和索引文件
       表名.idb:表記錄、
       支持行級鎖
       支持外鍵、事物操做
  Myisam特色:
       獨享表空間
         表名.frm:表結構
 表名.myd:表記錄mydata
 表名.myi:索引文件 myindex
       支持表級鎖
如何決定使用哪一個存儲引擎?
      執行查詢操做多的表用MyISAM(使用InoDB浪費資源)
      執行寫操做多的表用InnoDB
MySQL調優:
     1.選擇合適的存儲引擎
        讀操做多:MyISAM
寫操做多:InnoDB
     2.建立索引
        在select、where、order by 常常涉及到的字段創建索引
     3.SQL語句優化
        1).where子句中儘可能不使用 != 不然放棄索引全表掃描
2).儘可能避免 NULL 值判斷 不然放棄索引全表掃描
  優化前:
      select number from t1 where number isnull;
          優化後:
      在number列上設置默認值0,確保number列無NULL值
      select number from t1 where number=0;
3).儘可能避免 or 鏈接條件,不然放棄索引全表掃描
  優化前:
      select id from t1 where id=0 or id=20;
  優化後:
      select id from t1 where id=10
      union all
      select id from t1 where id=20
      union all
      select id from t1 where id=30;
      union all:
         將查詢結果鏈接起來
        4).模糊查詢儘可能避免使用前置%,否者全表掃描
      select name from t1 where name like 「%c%」;
5).儘可能避免使用 in 和 not in 不然全表掃描
  優化前:
      select id from t1 where id in(1,2,3,4);
  優化後:
      select id from t1 where id between 1 and 4;
6).儘可能避免使用* 不要返回任何用不到的字段
 
事物和事物回滾
     定義:一件事從開始發生到結束的整個過程
     做用:確保數據的一致性
     事物和事物回滾應用
         MySQL中SQL命令會自動commit到數據庫
 show variables like「autocommit」
     事物應用:
        開始事物
   begin;此時autocommit被禁用
        事物提交
           commit
終止事物
   rollback;
 
與python交互:
   交互類型
   python3:pymysql 模塊
   安裝:
     在線:sudo pip3 install pymysql
     離線:pymysql-0.7.11.tar.gz
           tar -zxvf pymysql-0.7.11.tar.gz
   cd pymysql-0.7.11
   sudo python3 setup.py install
    python2: 模塊:MySQLdb
       安裝:sudo pip install mysql-python
 
 
 
pymysql使用流程:
    1.創建數據庫連接:(db = pymysql.connect(....))
    2.建立遊標對象:(c = db.cursor())
    3.遊標方法:(c.execute(「insert .....」))
    4.提交到數據庫:db.commit()
    5.關閉遊標對象:c.close()
    6.斷開數據庫連接:db.close()
     connect對象:
        db = pymysql.connect(參數列表)
1.host:主機地址,本地 localhost
2.port:端口,默認3306,8080(可省略)
3.user:用戶名
4.password:密碼
5.database:庫
6.charset:編碼方式,推薦使用utf8
數據庫連接對象(db)的方法:
    1.db.close() 關閉連接
    2.db.commit()提交到數據庫
    3.db.rollback()回滾
    4.cur = db.cursor()返回遊標對象,用於執行具體SQL命名
      遊標對象(cur)的方法:
          1.cur.execute(SQL命令,[列表])執行SQL命令
  2.cur.close()關閉遊標對象
          3.cur.fetchone()獲取查詢結果的第一條數據
  4.cur.fetchmany(n)獲取n條記錄
  5.cur.fetchall()獲取全部記錄
示例:
 
增、刪、改、查、參數化
 
 
# frist.py
import pymysql # 建立數據庫對象
db = pymysql.connect(host="localhost", user="root", password="123456", database="db4", charset="utf8") # 利用db方法建立遊標對象
cur = db.cursor() # 利用遊標對象的execute()方法執行SQL命令
cur.execute("insert into sheng values\ (16,300000,'臺灣省');") # 提交到數據庫
db.commit() # 關閉遊標對象
cur.close() # 斷開數據庫連接
db.close() # 增 刪 改

import pymysql # 建立數據庫連接 # 連接到db4庫
db = pymysql.connect(host="localhost", user="root", password="123456", database="db4", charset="utf8") # 建立遊標
cur = db.cursor() try: # 添加記錄
    cur.execute("insert into sheng values (17,168800,'浙江');") # 修改記錄
    cur.execute("update sheng set id=666 where id=17;") # 刪除記錄
    cur.execute("delete from sheng where s_name='浙江';") # 截獲EXception類型錯誤
except Exception as e: # 出現異常後回滾
 db.rollback() # 輸出錯誤
    print("Error ", e) else: # 提交數據
 db.commit() # 關閉遊標
cur.close() # 斷開數據庫連接
db.close() # 查詢

import pymysql # 建立數據庫連接
db = pymysql.connect(host="localhost", user="root", password="123456", database="db4", charset="utf8") # 建立遊標
cur = db.cursor() try: # 查找
    cur.execute("select * from sheng;") # 取出一條記錄就少一條
    print("***************************") data1 = cur.fetchone() print(data1) print("***************************") data2 = cur.fetchmany(3) for i in data2: print(i) print("***************************") # 遍歷取出數據
    data3 = cur.fetchall() for x in data3: print(x) # 提交數據
 db.commit() except Exception as e: db.rollback() print("Error ", e) # 關閉遊標
cur.close() # 斷開數據庫連接
db.close() # 參數化

import pymysql # 建立數據庫連接
db = pymysql.connect(host="localhost", user="root", password="123456", database="db4", charset="utf8") # 建立遊標
cur = db.cursor() try: s_id = input("請輸入省的編號") s_name = input("請輸入省的名字") # 用佔位符參數化數據
    sql_insert = "insert into sheng(s_id,s_name) values(%s,%s)"
    # execute方法 傳參必須是列表
 cur.execute(sql_insert, [s_id, s_name]) # 提交數據
 db.commit() except Exception as e: db.rollback() print("Error ", e) # 關閉遊標
cur.close() # 斷開數據庫連接
db.close()

 



 
封裝類

# mysqlpython.py

# 導入mysql模塊
from pymysql import *


class MysqlPython: def __init__(self, database,  #
                 host="127.0.0.1",  # ip地址
                 user="root",  # 用戶名
                 password="123456",  # 密碼
                 port=3306,  # 端口
                 charset="utf8"):  # 字符集
        self.host = host self.database = database self.user = user self.password = password self.port = port self.charset = charset def open(self):  # 建立數據庫連接函數
        self.db = connect(host=self.host, database=self.database, user=self.user, password=self.password, port=self.port, charset=self.charset) self.cur = self.db.cursor()  # 建立遊標對象

    def close(self):  # 建立斷開數據庫連接 關閉遊標函數
 self.cur.close() self.db.close() def zhixing(self, sql, L=[]):  # 建立pymysql.execute() 方法函數
        try: self.open() # 連接數據庫
            self.cur.execute(sql, L)  # 參數化執行SQL命令
            self.db.commit()  # 提交數據
            print("ok") except Exception as e: self.db.rollback() # 出錯取消提交
            print("Failed", e) self.close() # 斷開數據庫連接 關閉遊標

    def all(self, sql, L=[]): try: self.open() self.cur.execute(sql, L) result = self.cur.fetchall() return result except Exception as e: print("Failed", e) self.close()

 

 
調用模塊.類

# frist.py

from mysqlpython import MysqlPython # 建立數據庫連接
sqlh = MysqlPython("db4") # 建立數據庫對象
sql_update = "update sheng set s_name='遼寧省'\ where s_name='雲南省';"

# 調用xiugai函數 執行SQL命令:sql_update
sqlh.zhixing(sql_update) sql_select = "select * from sheng where id=%s;"

# 調用all函數 執行SQL命令:sql_select
date = sqlh.all(sql_select, [1]) print(date)

 


用戶登陸系統示例:


 
 
from mysqlpython import Mysqlpython from hashlib import sha1 uname = input("請輸入用戶名:") pwd = input("請輸入密碼:") # 用sha1給pwd加密
 s1 = sha1()  # 建立sha1加密對象
s1.update(pwd.encode("utf8"))  # 指定編碼
pwd2 = s1.hexdigest()  # 返回16進制加密結果
 sqlh = Mysqlpython("db4") select = "select password from user where \ username=%s;" result = sqlh.all(select, [uname]) # print(result) # (('7c4a8d09ca3762af61e59520943dc26494f8941b',),)

if len(result) == 0: print("用戶名不存在") elif result[0][0] == pwd2: print("登陸成功") else: print("密碼錯誤")

 

 
orm(Object Relation Mapping)對象關係映射
    1.定義
       把對象模型映射到MySQL數據庫中
 二、sqlalchemy安裝:
    在線 :sudo pip3 install sqlalchemy
    離線 :
      $ tar -zxvf SQLAlchemy-1.2.10.tar.gz
      $ cd SQLAlchemy-1.2.10
      $ sudo python3 setup.py install
    驗證:
      $ python3
      >>> import sqlalchemy
      >>> 
 
 

 

 orm

# 建立一張表

# 鏈接數據庫的模塊
from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String engine = create_engine("mysql+pymysql://root:123456@localhost/db4", encoding="utf8") Base = declarative_base()  # orm基類

class User(Base):  # 繼承Base基類
    __tablename__ = "t123" id = Column(Integer, primary_key=True) name = Column(String(20)) address = Column(String(40)) Base.metadata.create_all(engine)

 

 
ER模型:
    定義: 關係模型 用於數據庫設計
三個概念
  1.實體:矩形框
  2.屬性:橢圓形
  3.橢圓形:實體之間的關係
       1).一對一關係(1:1)
       2).一對多關係(1:n)
       3).多對多關係(m,n)
 
相關文章
相關標籤/搜索