Flask學習 5 mysql基礎

2021-09-26 03:26:31 字數 4389 閱讀 2081

未利用資料庫連線池

import pymysql

db = pymysql.connect(host='127.0.0.1',user='root',port=3306,password='111111',db='test')

cursor = db.cursor() # 建立字典游標:cursor = db.cursor(pymysql.cursors.dictcursor)

sql = "insert into user(,regist_date) values('',)".format(key=keys, value=values, regist_date='now()')

res = cursor.execute(sql) # res為影響行數,此處為1;查詢時為查詢到的行數

db.commit() # 增加、刪除、修改需要commit()提交,且當異常時使用 db.rollback() 回滾 ; 查詢時不需要提交

return res

查詢時:

sql = "select......"

cursor.execute(sql)

res = cursor.fetchall() # 獲得全部資料

# res = cursor.fetchone() # 獲得第一條資料

return res

利用資料庫連線池

安裝 dbutils

pip install dbutils

db_config =
dao /init.py:

import pymysql

from dbutils.pooleddb import pooleddb, shareddbconnection

pool = pooleddb(

# 使用鏈結資料庫的模組

creator=pymysql,

# 連線池允許的最大連線數,0和none表示不限制連線數

maxconnections=6,

# 初始化時,鏈結池中至少建立的空閒的鏈結,0表示不建立

mincached=2,

# 鏈結池中最多閒置的鏈結,0和none不限制

maxcached=5,

# 鏈結池中最多共享的鏈結數量,0和none表示全部共享。

# 因為pymysql和mysqldb等模組的 threadsafety都為1,

# 所有值無論設定為多少,maxcached永遠為0,所以永遠是所有鏈結都共享。

maxshared=3,

# 連線池中如果沒有可用連線後,是否阻塞等待。true,等待;false,不等待然後報錯

blocking=true,

# 乙個鏈結最多被重複使用的次數,none表示無限制

maxusage=none,

# 開始會話前執行的命令列表。如:["set datestyle to ...", "set time zone ..."]

setsession=,

# ping mysql服務端,檢查是否服務可用。

# 如:0 = none = never, 1 = default = whenever it is requested,

# 2 = when a cursor is created, 4 = when a query is executed, 7 = always

ping=0,

host=db_config["host"], # 主機位址

user=db_config["user"], # 資料庫使用者名稱

password=db_config["password"], # 資料庫密碼

port=db_config["port"],# 埠

database=db_config["database"],# 資料庫名

# 字元編碼

charset='utf8'

)

利用python在dao裡新建表

def create_table_mysql():

db = pool.connection()

cursor = db.cursor()

sql = "create table create_table_mysql(" \

"id int primary key, " \

"name varchar(255) not null, " \

"birthday datetime" \

")"res = cursor.execute(sql)

print(res)

利用python在dao裡呼叫儲存過程

def call_procedure_mysql():

import pymysql

db = pymysql.connect(host='127.0.0.1',user='root',port=3306,password='123456',db='school2')

cursor = db.cursor()

name = '李大奎'

c = 'c'

sql = "call pro_getgrade('','',@r)".format(name=name,c=c)

cursor.execute(sql)

# cursor.execute('select @r')

res = cursor.fetchall()

print(res)

db.close()

資料庫操作是原子性的。

資料庫連線db事務自動begin

即 insert、update、delete時,進行異常處理需要:

try:

.....

db.commit()

return res

exception exception as ex:

print(ex)

if db:

db.rollback()

finally:

if db:

db.close()

當進行 select 時,則不需要:

try:

.....

return res

exception exception as ex:

print(ex)

finally:

if db:

db.close()

sql 語句

insert - - - 將key、value組合成字串,進行不定長插入,注意:』』 的引號,因為是字串

keys = ','.join(list(user.keys()))

values = "','".join(list(user.values()))

sql = "insert into user(,regist_date) values('',)".format(key=keys, value=values, regist_date='now()')

update - - - 將set 語句對應的 key和value 從引數dict_info 中獲取出來,連線成字串,注意:id 是int型別,不需要』'

id = dict_info["id"]

dict_info.pop("id")

set_item = list(i[0] + " = '" + i[1] + "'" for i in list(dict_info.items()))

set_str = ",".join(set_item)

sql = "update table_name set where id = ".format(set_str=set_str, id=id)

select - - - 將where 語句對應的key 和value從引數中取出,連線成字串

item = list(i[0] + " = '" + i[1] + "'" for i in list(conditions.items()))

cds = ' and '.join(item)

sql = "select * from table_name where ".format(conditions=cds)

自動增長的序列,獲得其值:

id=connect.insert_id()

print(connect.affected_rows())

MySQL學習筆記5 MySQL 鎖機制

鎖的分類 從資料操作的型別 讀 寫 分 從對資料操作的顆粒度 特點 偏向myisam儲存引擎,開銷小,加鎖快,無死鎖,鎖定粒度大,發生鎖衝突的概率最高,併發最低。create 特點 偏向innodb儲存引擎,開銷大,加鎖慢 會出現死鎖 鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。innodb與...

5 Mysql效能分析

1.慢查詢日誌 2.檢視問題sql的執行計畫 3.優化慢sql 4.檢視慢sql執行時的效能使用情況 5.調整系統引數 6.提公升伺服器硬體1.引數,開啟sql sql set global slow query log on set global long query time 1 配置檔案 my...

5) MySQL插入資料

mysql insert語句允許您將一行或多行插入到表中。下面說明了insert語句的語法 insert into table column1,column2.values value1,value2,首先,在insert into子句之後,在括號內指定表名和逗號分隔列的列表。然後,將括號內的相應列...