python基礎筆記--mysql

SQL語句主要分爲:
DQL:數據查詢語言,用於對數據進行查詢,如select
DML:數據操作語言,對數據進行增加、修改、刪除,如insert、udpate、delete
TPL:事務處理語言,對事務進行處理,包括begin transaction、commit、rollback
DCL:數據控制語言,進行授權與權限回收,如grant、revoke
DDL:數據定義語言,進行數據庫、表的管理等,如create、drop
CCL:指針控制語言,通過控制指針完成表的操作,如declare cursor

創建Connection連接

conn = connect(host=‘localhost’, port=3306, user=‘root’, password=‘mysql’, database=‘python1’, charset=‘utf8’)

得Cursor對象

cs = conn.cursor()

更新

sql = ‘update students set name=“劉邦” where id=6’

刪除

sql = ‘delete from students where id=6’

執行select語句,並返回受影響的行數:查詢一條學生數據

sql = ‘select id,name from students where id = 7’

sql = ‘SELECT id,name FROM students WHERE id = 7’

count=cs.execute(sql)

打印受影響的行數

print(count)

數據完整性
一個數據庫就是一個完整的業務單元,可以包含多張表,數據被存儲在表中
在表中爲了更加準確的存儲數據,保證數據的正確有效,可以在創建表的時候,爲表添加一些強制性的驗證,包括數據字段的類型、約束
數據類型
可以通過查看幫助文檔查閱所有支持的數據類型
使用數據類型的原則是:夠用就行,儘量使用取值範圍小的,而不用大的,這樣可以更多的節省存儲空間
常用數據類型如下:
整數:int,bit
小數:decimal
字符串:varchar,char
日期時間: date, time, datetime
枚舉類型(enum)
特別說明的類型如下:
decimal表示浮點數,如decimal(5,2)表示共存5位數,小數佔2位
char表示固定長度的字符串,如char(3),如果填充’ab’時會補一個空格爲’ab ’
varchar表示可變長度的字符串,如varchar(3),填充’ab’時就會存儲’ab’
字符串text表示存儲大文本,當字符大於4000時推薦使用
對於圖片、音頻、視頻等文件,不存儲在數據庫中,而是上傳到某個服務器上,然後在表中存儲這個文件的保存路徑

約束
主鍵primary key:物理上存儲的順序
非空not null:此字段不允許填寫空值
惟一unique:此字段的值不允許重複
默認default:當不填寫此值時會使用默認值,如果填寫時以填寫爲準
外鍵foreign key:對關係字段進行約束,當爲關係字段填寫值時,會到關聯的表中查詢此值是否存在,如果存在則填寫成功,如果不存在則填寫失敗並拋出異常
說明:雖然外鍵約束可以保證數據的有效性,但是在進行數據的crud(增加、修改、刪除、查詢)時,都會降低數據庫的性能,所以不推薦使用,那麼數據的有效性怎麼保證呢?答:可以在邏輯層進行控制

數據庫
查看所有數據庫
show databases;
使用數據庫
use 數據庫名;
查看當前使用的數據庫
select database();
創建數據庫
create database 數據庫名 charset=utf8;
例:
create database python charset=utf8;
刪除數據庫
drop database 數據庫名;
例:
drop database python;

查看當前數據庫中所有表
show tables;
查看錶結構
desc 表名;

表的設計:
一對一;
一對多;
多對多;

多對多一般有第三張表 做關聯

向表中插入數據:-- 向students表中插入數據
insert into students values
(0,‘小明’,18,180.00,2,1,0),
(0,‘小月月’,18,180.00,2,2,1),

查詢所有字段
select * from 表名;
例:
select * from students;
查詢指定字段
select 列1,列2,… from 表名;
例:
select name from students;
使用 as 給字段起別名
select id as 序號, name as 名字, gender as 性別 from students;
可以通過 as 給表起別名

select * from 表名 where 條件;
例:
select * from students where id=1;

比較運算符
等於: =
大於: >
大於等於: >=
小於: <
小於等於: <=
不等於: != 或 <>
例1:查詢編號大於3的學生

select * from students where id > 3;
例2:查詢編號不大於4的學生

select * from students where id <= 4;
例3:查詢姓名不是“黃蓉”的學生

select * from students where name != ‘黃蓉’;
例4:查詢沒被刪除的學生

select * from students where is_delete=0;

邏輯運算符
and
or
not
例5:查詢編號大於3的女同學

select * from students where id > 3 and gender=0;
例6:查詢編號小於4或沒被刪除的學生

select * from students where id < 4 or is_delete=0;
模糊查詢
like
%表示任意多個任意字符
_表示一個任意字符
例7:查詢姓黃的學生

select * from students where name like ‘黃%’;
例8:查詢姓黃並且“名”是一個字的學生

select * from students where name like ‘黃_’;
例9:查詢姓黃或叫靖的學生

select * from students where name like ‘黃%’ or name like ‘%靖’;
範圍查詢
in表示在一個非連續的範圍內
例10:查詢編號是1或3或8的學生

select * from students where id in(1,3,8);
between … and …表示在一個連續的範圍內
例11:查詢編號爲3至8的學生

select * from students where id between 3 and 8;
例12:查詢編號是3至8的男生

select * from students where (id between 3 and 8) and gender=1;
空判斷
注意:null與’'是不同的
判空is null
例13:查詢沒有填寫身高的學生

select * from students where height is null;
判非空is not null
例14:查詢填寫了身高的學生

select * from students where height is not null;
例15:查詢填寫了身高的男生

select * from students where height is not null and gender=1;
優先級
優先級由高到低的順序爲:小括號,not,比較運算符,邏輯運算符
and比or先運算,如果同時出現並希望先算or,需要結合()使用

排序
爲了方便查看數據,可以對數據進行排序

語法:
select * from 表名 order by 列1 asc|desc [,列2 asc|desc,…]

說明
將行數據按照列1進行排序,如果某些行列1的值相同時,則按照列2排序,以此類推
默認按照列值從小到大排列(asc)
asc從小到大排列,即升序
desc從大到小排序,即降序
例1:查詢未刪除男生信息,按學號降序

select * from students where gender=1 and is_delete=0 order by id desc;
例2:查詢未刪除學生信息,按名稱升序

select * from students where is_delete=0 order by name;
例3:顯示所有的學生信息,先按照年齡從大–>小排序,當年齡相同時 按照身高從高–>矮排序

select * from students order by age desc,height desc;

聚合函數
爲了快速得到統計數據,經常會用到如下5個聚合函數

總數
count(*)表示計算總行數,括號中寫星與列名,結果是相同的
例1:查詢學生總數

select count(*) from students;
最大值
max(列)表示求此列的最大值
例2:查詢女生的編號最大值

select max(id) from students where gender=2;
最小值
min(列)表示求此列的最小值
例3:查詢未刪除的學生最小編號

select min(id) from students where is_delete=0;
求和
sum(列)表示求此列的和
例4:查詢男生的總年齡

select sum(age) from students where gender=1;

– 平均年齡
select sum(age)/count(*) from students where gender=1;
平均值
avg(列)表示求此列的平均值
例5:查詢未刪除女生的編號平均值

select avg(id) from students where is_delete=0 and gender=2;

獲取部分行
當數據量過大時,在一頁中查看數據是一件非常麻煩的事情

語法
select * from 表名 limit start,count
說明
從start開始,獲取count條數據
例1:查詢前3行男生信息

select * from students where gender=1 limit 0,3;
示例:分頁
已知:每頁顯示m條數據,當前顯示第n頁
求總頁數:此段邏輯後面會在python中實現
查詢總條數p1
使用p1除以m得到p2
如果整除則p2爲總數頁
如果不整除則p2+1爲總頁數
求第n頁的數據
select * from students where is_delete=0 limit (n-1)*m,m

所謂事務,它是一個操作序列,這些操作要麼都執行,要麼都不執行,它是一個不可分割的工作單位。

事務四大特性(簡稱ACID)
原子性(Atomicity)
一致性(Consistency)
隔離性(Isolation)
持久性(Durability)

原子性(atomicity)
一個事務必須被視爲一個不可分割的最小工作單元,整個事務中的所有操作要麼全部提交成功,要麼全部失敗回滾,對於一個事務來說,
不可能只執行其中的一部分操作,這就是事務的原子性

一致性(consistency)
數據庫總是從一個一致性的狀態轉換到另一個一致性的狀態。(在前面的例子中,一致性確保了,即使在執行第三、四條語句之間時系統崩潰,
支票賬戶中也不會損失200美元,因爲事務最終沒有提交,所以事務中所做的修改也不會保存到數據庫中。)

隔離性(isolation)
通常來說,一個事務所做的修改在最終提交以前,對其他事務是不可見的。(在前面的例子中,當執行完第三條語句、第四條語句還未開始時,
此時有另外的一個賬戶彙總程序開始運行,則其看到支票帳戶的餘額並沒有被減去200美元。)

持久性(durability)
一旦事務提交,則其所做的修改會永久保存到數據庫。(此時即使系統崩潰,修改的數據也不會丟失。)

開啓事務,命令如下:
開啓事務後執行修改命令,變更會維護到本地緩存中,而不維護到物理表中
begin;
或者
start transaction;
提交事務,命令如下
將緩存中的數據變更維護到物理表中
commit;
回滾事務,命令如下:
放棄緩存中變更的數據
rollback;

索引的使用
查看索引
show index from 表名;
創建索引
如果指定字段是字符串,需要指定長度,建議長度與定義字段時的長度一致
字段類型如果不是字符串,可以不填寫長度部分
create index 索引名稱 on 表名(字段名稱(長度))
刪除索引:
drop index 索引名稱 on 表名;

web靜態服務器非堵塞:

單進程模式:

  1. 會將所有的新的鏈接的socket鏈接放在一個列表面形成隊列;
  2. 將套接字設置爲非堵塞
    server_socket.setblocking(False)
    設置爲非堵塞之後;如果accept時恰巧沒有客戶端鏈接connect,那麼
    accpet就會產生一個異常,所以使用try來進行處理;
    try:
    newClientInfo = server_socket.accept()
    except Exception as result:
    pass
    else:
    print(“一個新的客戶端到來:%s” % str(newClientInfo))
    newClientInfo[0].setblocking(False) # 設置爲非堵塞
    g_socket_list.append(newClientInfo)

web靜態服務器epoll

IO輸入與輸出的多路複用; 基本的原理就是select,poll, epoll這個function會不斷的輪詢所負責的所有的socket
,當某個socket有數據到達的時候,就會通知進程。

創建一個epoll對象

epoll = select.epoll()

epoll的幾個屬性:
EPOLLN(可讀)
EPOLLOUT(可寫)
EPOLLET(ET模式)

對於epoll的小結; 簡單說就是,爲了提高服務器處理socket的鏈接的效率,會監視列表裏面;當任何socket有可讀可寫的時候
立馬處理;如果select/epoll手裏同時檢測着很多socket,一有動靜就會馬上返回給進程處理,就會比
一個一個socket過來,阻塞等待處理的效率要高。

私有化:

xx: 公有變量
_x: 單前置下劃線,私有化屬性或方法,from somemodule import *禁止導入,類對象和子類可以訪問
_xx:雙前置下劃線,避免與子類中的屬性命名衝突,無法在外部直接訪問(名字重整所以訪問不到)
xx:雙前後下劃線,用戶名字空間的魔法對象或屬性。例如:init , __ 不要自己發明這樣的名字
xx
:單後置下劃線,用於避免與Python關鍵詞的衝突

父類中屬性名爲__名字的,子類不繼承,子類不能訪問
如果在子類中向__名字賦值,那麼會在子類中定義的一個與父類相同名字的屬性
_名的變量、函數、類在使用from xxx import *時都不會被導入

面向對象的三大特性;
封裝,繼承,多態;

爲什麼要封裝:
實際開發中會出現,併發程序對同一個全局變量操作的問題;

所以我們將變量+函數製作成一個模板,這樣每個人需要這個函數的功能和
這個變量的數據的時候就自己去拿,拿到的都是初始值。

繼承:
爲什麼要繼承:

有時候爲了對一個類的方法進行擴充;爲了不再去從新寫一份代碼,就可以通過繼承,對父類方法進行重寫。
省去了很多不必要的麻煩;
能夠提升代碼的重用率,即開發一個類,可以在多個子功能中直接使用
繼承能夠有效的進行代碼的管理,當某個類有問題只要修改這個類就行,而其繼承這個類的子類往往不需要就修改

多繼承中 super的好處
如果2個子類中都繼承了父類,當在子類中通過父類名調用時,parent被執行了2次
如果2個子類中都繼承了父類,當在子類中通過super調用時,parent被執行了1次

但在多繼承上有區別,super方法能保證每個父類的方法只會執行一次,而使用類名的方法會導致方法被執行多次,具體看前面的輸出結果

前提 super使用父類傳遞參數的時候,必須將參數全部傳遞,否則就會報錯;

什麼是實例屬性:
類中定義的函數下init下面的self.name = name 就是實例屬性

什麼是類屬性:
定義的類下方的: 一個變量值;

class Province(object):
# 類屬性
country = ‘中國’

def __init__(self, name):
    # 實例屬性
    self.name = name

創建一個實例對象

obj = Province(‘山東省’)

直接訪問實例屬性

print(obj.name)

直接訪問類屬性

Province.country

類對象在內存中只存在一份
實例屬性在每個對象中都要保存一份

所以通過類創建實例對象時候,如果每個對象需要具有相同名字的屬性,那麼
就使用類屬性,用一份即可;

方法包括:實例方法、靜態方法和類方法,三種方法在內存中都歸屬於類,區別在於調用方式不同。

實例方法:由對象調用;至少一個self參數;執行實例方法時,自動將調用該方法的對象賦值給self;
類方法:由類調用; 至少一個cls參數;執行類方法時,自動將調用該方法的類賦值給cls;
靜態方法:由類調用;無默認參數;

Python的property屬性的功能是:property屬性內部進行一系列的邏輯計算,最終將計算結果返回。

property屬性的有兩種方式
裝飾器 即:在方法上應用裝飾器
類屬性 即:在類中定義值爲property對象的類屬性

魔法屬性都有那些:

doc:用來顯示類的描述信息;
_module:表示當前操作在那個模塊;
_class:表示當前的對象類是什麼;
_init:初始化方法;
del:當對象在內存中被釋放時自動觸發;
call:
dict:
str:
getitemsetitemdelitem
getslicesetslicedelslice

任何實現了 enter() 和 exit() 方法的對象都可稱之爲上下文管理器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章