PYTHON1.day21
Flush PRIVILEGES;?? -- 刷新權(quán)限并生效
6)查看授權(quán)
?? - 查看當(dāng)前用戶: show grants;
?? -查看其他用戶:? show grants for '用戶名'@'客戶端';
7)吊銷權(quán)限(取消用戶的某個權(quán)限)
?? - 語法: revoke 權(quán)限列表 on 庫名.表名 from '用戶名'@'客戶端地址'
?? - 示例: 吊銷Daniel用戶所有庫,所有列表的插入數(shù)據(jù)權(quán)限
?????????? revoke insert on *.* from 'bank_user'@'%';
?????????? revoke insert on bank.* from 'bank_user'@'%';
4. 數(shù)據(jù)庫事務(wù)(重點)
?? - 事務(wù)(Transacyion):
?? - 數(shù)據(jù)庫執(zhí)行一系列操作時,全都執(zhí)行,全都不執(zhí)行
???? 保證數(shù)據(jù)的一致性、正確性
?? - 例如在一筆轉(zhuǎn)賬中,執(zhí)行需要三個操作,
???????? 從轉(zhuǎn)出賬戶減去相應(yīng)金額
???????? 在轉(zhuǎn)入賬戶增加相應(yīng)金額
???????? 登記一筆轉(zhuǎn)賬明細
???????? 以上三個操作,要么全部成功,要么全部失敗
?? 3)使用事務(wù)的情況
???? - 涉及到多表的增刪改操作
???? - 執(zhí)行這些操作時需要保證一致性,正確性
?? 4)啟用事務(wù)條件要求:必須是Innodb存儲引擎
?? 5)事務(wù)的額特征(ACID):
????? - 原子性(Atomicity):事務(wù)是一個整體,要么全部執(zhí)行,要么全部不執(zhí)行
????? - 一致性(Consis.
????? tency):事務(wù)執(zhí)行完成后,從一個一致狀態(tài)變成另一個一致狀態(tài)
????? - 隔離性(Isolation):不同的事務(wù)不會相互影響,干擾
????? - 持久性(Durability):一旦事務(wù)提交,對數(shù)據(jù)庫的修改就必須永久保留下來
?? 6)如何進行事務(wù)操作
??? - 開啟: start transaction
???? - 提交: commit
???? - 回滾:rollback
???? - 示例:在兩個賬戶間進行轉(zhuǎn)賬
???????????? 第一步:減去轉(zhuǎn)出賬戶余額
???????????? 第二步:在轉(zhuǎn)入賬號上加上相等的余額
???????????? 提交事務(wù)
???????????? start transaction;
???????????? update acct_new set balance = balance - 100
??????????????????? where acct_no = '6223450001';
???????????? update acct_new set balance = balance + 100
??????????????????? where acct_no ='622456000020';
???????????? commit;---或rollback
???????????? ----在提交事務(wù)前,重新登錄一個客戶端
???????????? ----查看數(shù)據(jù)是否變更
????
???? 7)SQL語句分類
????? - 數(shù)據(jù)查詢語言(DQL):查詢數(shù)據(jù),不改變數(shù)據(jù)
????? - 數(shù)據(jù)定義語言(DDL):定義數(shù)據(jù)結(jié)構(gòu),如建表/庫,刪除庫/表,創(chuàng)建/刪除索引,修改表結(jié)構(gòu)
????? - 數(shù)據(jù)操作語言(DML):對數(shù)據(jù)進行增刪改
????? - 數(shù)據(jù)控制語言(DCL):權(quán)限管理,事務(wù)操作,數(shù)據(jù)庫監(jiān)視...
???
-------------------------------------------------day25.new---------------------------------------------------
1.鎖
?? 1)鎖:對數(shù)據(jù)庫的控制權(quán)
?? 2)目的:解決多個工作單元并發(fā)操作數(shù)據(jù)的正確性
?? 3)分類:
???? a)鎖類型
?????? - 讀鎖(共享鎖):加鎖后,可以讀取,但不能修改
?????? - 寫鎖(排它鎖):加鎖后,不能進行讀寫
??? b)鎖粒度
?????? - 行級鎖(細粒度):鎖定一行,并發(fā)效率高
???????? 控制較為復(fù)雜,消耗資源多
?????? - 表級鎖(粗粒度):鎖定整張表,并發(fā)效率低
???????? 控制簡單,消耗資源較少
2.存儲引擎
?? 1)什么是存儲引擎:表的存儲方式,包括存儲機制,索引機制,鎖定方式等
?? 2)基本操作:
???? - 查看:show engines;
???? - 查看某個表的存儲引擎方式:show create table 表名
???? -建表時指定存儲引擎
????? create table t1(id int primary key)engine=InnoDB default charset=utf8;
???????????????????????????????????????? engine 指定存儲
???? - 修改存儲引擎方式
?????? alter table t1 engine = MyISAM;
?? 3)常見存儲引擎
???? a)InooDB
????? 特點:支持事務(wù),行級鎖,外鍵
????? 共享表空間
???? *.frm??? 表結(jié)構(gòu)和索引
????? *.ibd??? 表記錄
????? show global variables like '%datadir'命令查看數(shù)據(jù)存儲位置????
????? sudo -i切換到root用戶,進入目錄查看
???? - 使用場合
?????? 更新操作密集的表
?????? 有數(shù)據(jù)庫事務(wù)支持的要求
?????? 自動災(zāi)備,恢復(fù)
?????? 有外鍵約束要求
?????? 支持自增長字段(auto_increment)
???? b)MyISAM
?????? - 支持表級鎖定、不支持事務(wù)、不支持外鍵
???????? 不支持行鎖定,訪問速度較快
?????? - 獨享表空間
?????????? 表名.frm: 表結(jié)構(gòu)
?????????? 表名.myd: 表數(shù)據(jù)
?????????? 表名.myi: 表索引
?????? - 適用場合
?????????? 查詢操作較多
?????????? 數(shù)據(jù)一致性要求較低(不支持事務(wù))
?????????? 沒有外鍵約束
??? c)Memory(內(nèi)存表):
???????? - 表結(jié)構(gòu)存儲在磁盤上(硬盤),數(shù)據(jù)存儲在內(nèi)存
?????????? 訪問速度很快
???????? - 文件:表名.frm?? 存儲表結(jié)構(gòu)
???????? - 服務(wù)(或機器)重啟后,表中的數(shù)據(jù)丟失
???????? - 適用場合:
?????????????? 數(shù)據(jù)量小、訪問速度要求極快、訪問頻率高、
?????????????? 數(shù)據(jù)丟失后不會造成影響?
???????? - 示例:
?????????????? 1:創(chuàng)建memory引擎的表
???????????????? create table t2(id int)engine=memory;
?????????????? 2:插入數(shù)據(jù)并查詢
?????????????? 3:重啟服務(wù),再查詢,數(shù)據(jù)消失
???????????????? sudo /etc/init.d/mysql restart
???? 3. E-R模型:實體關(guān)系模型
?????????? a)實體(Entry): 現(xiàn)實中可以區(qū)分的事物稱之為實體
?????????? b)關(guān)系(Relationship): 實體之間的聯(lián)系
???????????? - 一對一
???????????? - 一對多
???????????? - 多對多
?????????? c)屬性:實體所具有的數(shù)據(jù)特征
?????????? d)E-R圖:用圖形化方式,表達實體間的關(guān)系
???????????? 矩形:表示實體
???????????? 橢圓:實體的屬性
???????????? 菱形:實體間的關(guān)系
?????????????? 一對一:菱形左右各寫一個1
?????????????? 一對多:菱形左右分別用1,N來表示
?????????????? 多對多:菱形左右分別用M, N來表示
?????????? e)練習(xí):畫出賬戶,交易明細,客戶實體之間的E-R圖(見ER圖.pptx)
???? 4. 使用Python訪問MySQL
?????? 1)pymysql庫:Python語言訪問MySQL接口
???????? - 安裝:
?????????? 在線:sudo pip3 install pymysql
?????????? 離線:
???????????? 第一步:下載安裝包,下載地址:
???????????????? https://pypi.org/project/PyMySQL/
???????????? PyMySQL-0.9.3.tar.gz
???????? 第二步:解壓包,并執(zhí)行安裝
???????????????? tar -zxvf PyMySQL-0.9.3.tar.gz
???????????? cd PyMySQL-0.9.3
???????? 第三步:進入目錄,安裝
???????????? python3 setup.py install
???????? - 驗證:進入Python交互模式,執(zhí)行導(dǎo)入包操作
???????????????? import pymysql
???????????? 如果不報錯,則說明安裝成功
??????? # 第一步:導(dǎo)入pymysql模塊
import pymysql
host = 'localhost'#服務(wù)器地址
user = 'root'#用戶名
passwd = '123456'#密碼
dbname = 'bank'#庫名稱
#第二步:建立到數(shù)據(jù)庫服務(wù)器的連接,創(chuàng)建連接對象
conn = pymysql.connect(host,user,passwd,dbname)
#第三步:獲取游標對象(cursor),通過調(diào)用數(shù)據(jù)庫連接 對象獲得游標????????
cursor = conn.cursor()
#第四步:利用cursor對象提供的方法,執(zhí)行SQL語句
cursor.execute("select * from acct_new")
result = cursor.fetchall()#取查詢到的數(shù)據(jù)
for r in result:
???? tmp = "帳號:%s,戶名:%s,金額:%s"%(r[1],r[1],r[6])
???? print(tmp)
#第五步:提交事務(wù)(如果需要)
#第六步:關(guān)閉游標對象
cursor.close()
#第七步:關(guān)閉數(shù)據(jù)庫連接對象
conn.close()
?????? 2)PyMySQL訪問MySQL的流程
???????? 第一步:導(dǎo)入pymysql模塊
???????? 第二步:建立到數(shù)據(jù)庫服務(wù)器的連接,創(chuàng)建連接對象
???????? 第三步:創(chuàng)建游標對象(cursor),通過調(diào)用數(shù)據(jù)庫連接
???????????????? 對象獲得游標
???????? 第四步:利用cursor對象提供的方法,執(zhí)行SQL語句
???????? 第五步:提交事務(wù)(如果需要)
???????? 第六步:關(guān)閉游標對象
???????? 第七步:關(guān)閉數(shù)據(jù)庫連接對象
??????
?????? 3)PyMySQL模塊的主要方法
???????? - connect:? 連接數(shù)據(jù)庫
???????????? 參數(shù):host??? 服務(wù)器地址
?????????????? port??? 服務(wù)器端口(省略連默認端)
?????????????? user??? 用戶名
?????????????? passwd??? 密碼
?????????????? db??? 數(shù)據(jù)庫名稱
?????????????? charset??? 指定編碼格式
??????? - connection連接對象支持的方法
??????????? cursor()??????? 獲取游標
??????????? commit()??????? 提交事務(wù)
??????????? rollback()??? 回滾事務(wù)
??????????? close()??????? 關(guān)閉游標
??????? - cursor游標對象支持的方法
??????????? execute(sql)??? 執(zhí)行SQL語句
??????????? fetchall()??? 取得查詢結(jié)果集中的所有數(shù)據(jù)
??????????? fetchone()??? 取查詢結(jié)果集中一筆數(shù)據(jù)
??????????? fetchmany(size)??? 取得指定筆數(shù)數(shù)據(jù)
??????????? close()??????? 關(guān)閉游標對象
?????????? 只讀屬性:
??????????? rowcount??????? 返回修改影響的筆數(shù)
?????? 4)示例:
????? 示例1:查詢
???????? # pymysql查詢示例
???????? import pymysql
???????? from db_conf import * #導(dǎo)入配置
??????? #建立到數(shù)據(jù)庫服務(wù)器的連接,創(chuàng)建連接對象
???????? conn = pymysql.connect(host, user, \
??????????????????? password, dbname)??????????????
??????? #創(chuàng)建游標對象(cursor),通過調(diào)用數(shù)據(jù)庫連接
???????? #對象獲得游標
???????? cursor = conn.cursor()
??????? #利用cursor對象,執(zhí)行SQL語句
???????? sql = "select * from acct"
???????? cursor.execute(sql)? #執(zhí)行SQL語句
??????? #取出查詢結(jié)果,并打印
???????? result = cursor.fetchall() #result是元組
???????? for r in result: #遍歷result
???????????? acct_no = r[0] #賬號
???????????? acct_name = r[1] #戶名
???????????? if r[6]: #判斷是否為空值
???????????? balance = float(r[6]) #余額
???????????? else:
???????????? balance = 0.00 #余額為空設(shè)置為0
???????????? print("賬號:%s, 戶名:%s, 余額:%.2f" % \
????????????? (acct_no, acct_name, balance))
???????? #關(guān)閉游標對象
???????? cursor.close()
???????? #關(guān)閉數(shù)據(jù)庫連接對象
???????? conn.close()
???????
??? ???? 示例2:插入
???????? # pymysql的插入示例
???????? import pymysql
???????? from db_conf import * #導(dǎo)入配置
??????? try:???????
???????????? conn = pymysql.connect(host, user, \
??????????????????? password, dbname)? #連接數(shù)據(jù)庫
???????????? cursor = conn.cursor()? #獲取游標
???????????? #執(zhí)行SQL語句
???????????? sql = '''insert into
?????????????? acct(acct_no, acct_name, cust_no,
??????????????? acct_type, reg_date, status, balance)
?????????????? values('622345000010','Robert', 'C0010',
??????????????? 1, date(now()), 1, 33.00)'''???
???????????? print(sql)
???????????? cursor.execute(sql) #執(zhí)行
???????????? conn.commit() #提交事務(wù)
???????????? print("Insert OK")
???????? except Exception as e:
???????????? print("數(shù)據(jù)庫插入異常")
???????????? print(e)
???????? finally:
???????????? cursor.close() #關(guān)閉游標
???????????? conn.close() #關(guān)閉連接
???????????
??????? 示例3:修改
???????? import pymysql
???????? from db_conf import * #導(dǎo)入配置
??????? try:???????
???????????? conn = pymysql.connect(host, user, \
??????????????????? password, dbname)? #連接數(shù)據(jù)庫
???????????? cursor = conn.cursor()? #獲取游標
???????????? #執(zhí)行SQL語句
???????????? sql = '''update acct
????????????????? set balance = balance + 1000
???????????????? where acct_no='622345000010'
???????????? '''???
???????????? cursor.execute(sql) #執(zhí)行
???????????? conn.commit() #提交事務(wù)
???????????? print("修改筆數(shù):%d" % cursor.rowcount)
???????? except Exception as e:
???????????? print("數(shù)據(jù)庫修改異常")
???????????? print(e)
???????? finally:
???????????? cursor.close() #關(guān)閉游標
???????????? conn.close() #關(guān)閉連接
??????? 示例4:刪除
??????? # pymysql刪除示例
???????? import pymysql
???????? from db_conf import * #導(dǎo)入配置
??????? try:???????
???????????? conn = pymysql.connect(host, user, \
??????????????????? password, dbname)? #連接數(shù)據(jù)庫
???????????? cursor = conn.cursor()? #獲取游標
???????????? #執(zhí)行SQL語句
???????????? sql = '''delete from acct
???????????? where acct_no='622345000010'
???????????? '''???
???????????? cursor.execute(sql) #執(zhí)行
???????????? conn.commit() #提交事務(wù)
???????????? print("刪除筆數(shù):%d" % cursor.rowcount)
???????? except Exception as e:
???????????? print("數(shù)據(jù)庫刪除異常")
???????????? print(e)
???????? finally:
???????????? cursor.close() #關(guān)閉游標
???????????? conn.close() #關(guān)閉連接
??? 課堂作業(yè):賬戶管理修改、刪除功能添加上
?????????????
???? 5. SQL語句優(yōu)化
?????? 1)在經(jīng)常查詢、排序的字段上建立索引
?????? 2)盡量少使用不等于條件判斷,不等于會放棄使用索引
?????? 3)少使用null值判斷,null值判斷會放棄使用索引
?????? 4)條件判斷少使用or連接,in,not in
?????? 5)模糊查詢避免%前置
?????? 6)查詢時如果select *,直接寫成字段名會提高效率
?????? 7)盡量少在where子句中,使用字段進行運算。例如:
????????? select * from acct where balance / 2 > 5000
?????? 8)數(shù)值類型的字段,進行條件比較時,一般比
????????? 字符串比較效率更高
???? 作業(yè):完善賬戶管理系統(tǒng)的修改、刪除功能
??????????? 賬戶管理系統(tǒng)啟動時,增加登錄功能
??????????? (原理:打印菜單前,先輸入用戶名、密碼
????????????? 并到數(shù)據(jù)庫自建的用戶表中查詢
????????? 如果用戶名、密碼匹配,則登錄成功)
轉(zhuǎn)載于:https://www.cnblogs.com/shengjia/p/10385772.html
總結(jié)
以上是生活随笔為你收集整理的PYTHON1.day21的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何设置取消小票的二维码
- 下一篇: Linux音频驱动简述