未利用資料庫連線池
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子句之後,在括號內指定表名和逗號分隔列的列表。然後,將括號內的相應列...