中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

在Python中編寫數(shù)據(jù)庫模塊的教程
來源:易賢網(wǎng) 閱讀:1071 次 日期:2015-05-04 10:41:54
溫馨提示:易賢網(wǎng)小編為您整理了“在Python中編寫數(shù)據(jù)庫模塊的教程”,方便廣大網(wǎng)友查閱!

這篇文章主要介紹了在Python中編寫數(shù)據(jù)庫模塊的教程,本文代碼基于Python2.x版本,需要的朋友可以參考下

在一個(gè)Web App中,所有數(shù)據(jù),包括用戶信息、發(fā)布的日志、評(píng)論等,都存儲(chǔ)在數(shù)據(jù)庫中。在awesome-python-app中,我們選擇MySQL作為數(shù)據(jù)庫。

Web App里面有很多地方都要訪問數(shù)據(jù)庫。訪問數(shù)據(jù)庫需要?jiǎng)?chuàng)建數(shù)據(jù)庫連接、游標(biāo)對(duì)象,然后執(zhí)行SQL語句,最后處理異常,清理資源。這些訪問數(shù)據(jù)庫的代碼如果分散到各個(gè)函數(shù)中,勢必?zé)o法維護(hù),也不利于代碼復(fù)用。

此外,在一個(gè)Web App中,有多個(gè)用戶會(huì)同時(shí)訪問,系統(tǒng)以多進(jìn)程或多線程模式來處理每個(gè)用戶的請(qǐng)求。假設(shè)以多線程為例,每個(gè)線程在訪問數(shù)據(jù)庫時(shí),都必須創(chuàng)建僅屬于自身的連接,對(duì)別的線程不可見,否則,就會(huì)造成數(shù)據(jù)庫操作混亂。

所以,我們還要?jiǎng)?chuàng)建一個(gè)簡單可靠的數(shù)據(jù)庫訪問模型,在一個(gè)線程中,能既安全又簡單地操作數(shù)據(jù)庫。

為什么不選擇SQLAlchemy?SQLAlchemy太龐大,過度地面向?qū)ο笤O(shè)計(jì)導(dǎo)致API太復(fù)雜。

所以我們決定自己設(shè)計(jì)一個(gè)封裝基本的SELECT、INSERT、UPDATE和DELETE操作的db模塊:transwarp.db。

設(shè)計(jì)db接口

設(shè)計(jì)底層模塊的原則是,根據(jù)上層調(diào)用者設(shè)計(jì)簡單易用的API接口,然后,實(shí)現(xiàn)模塊內(nèi)部代碼。

假設(shè)transwarp.db模塊已經(jīng)編寫完畢,我們希望以這樣的方式來調(diào)用它:

首先,初始化數(shù)據(jù)庫連接信息,通過create_engine()函數(shù):

from transwarp import db

db.create_engine(user='root', password='password', database='test', host='127.0.0.1', port=3306)

然后,就可以直接操作SQL了。

如果需要做一個(gè)查詢,可以直接調(diào)用select()方法,返回的是list,每一個(gè)元素是用dict表示的對(duì)應(yīng)的行:

users = db.select('select * from user')

# users =>

# [

# { "id": 1, "name": "Michael"},

# { "id": 2, "name": "Bob"},

# { "id": 3, "name": "Adam"}

# ]

如果要執(zhí)行INSERT、UPDATE或DELETE操作,執(zhí)行update()方法,返回受影響的行數(shù):

n = db.update('insert into user(id, name) values(?, ?)', 4, 'Jack')

update()函數(shù)簽名為:

update(sql, *args)

統(tǒng)一用?作為占位符,并傳入可變參數(shù)來綁定,從根本上避免SQL注入攻擊。

每個(gè)select()或update()調(diào)用,都隱含地自動(dòng)打開并關(guān)閉了數(shù)據(jù)庫連接,這樣,上層調(diào)用者就完全不必關(guān)心數(shù)據(jù)庫底層連接。

但是,如果要在一個(gè)數(shù)據(jù)庫連接里執(zhí)行多個(gè)SQL語句怎么辦?我們用一個(gè)with語句實(shí)現(xiàn):

with db.connection():

db.select('...')

db.update('...')

db.update('...')

如果要在一個(gè)數(shù)據(jù)庫事務(wù)中執(zhí)行多個(gè)SQL語句怎么辦?我們還是用一個(gè)with語句實(shí)現(xiàn):

with db.transaction():

db.select('...')

db.update('...')

db.update('...')

實(shí)現(xiàn)db模塊

由于模塊是全局對(duì)象,模塊變量是全局唯一變量,所以,有兩個(gè)重要的模塊變量:

# db.py

# 數(shù)據(jù)庫引擎對(duì)象:

class _Engine(object):

def __init__(self, connect):

self._connect = connect

def connect(self):

return self._connect()

engine = None

# 持有數(shù)據(jù)庫連接的上下文對(duì)象:

class _DbCtx(threading.local):

def __init__(self):

self.connection = None

self.transactions = 0

def is_init(self):

return not self.connection is None

def init(self):

self.connection = _LasyConnection()

self.transactions = 0

def cleanup(self):

self.connection.cleanup()

self.connection = None

def cursor(self):

return self.connection.cursor()

_db_ctx = _DbCtx()

由于_db_ctx是threadlocal對(duì)象,所以,它持有的數(shù)據(jù)庫連接對(duì)于每個(gè)線程看到的都是不一樣的。任何一個(gè)線程都無法訪問到其他線程持有的數(shù)據(jù)庫連接。

有了這兩個(gè)全局變量,我們繼續(xù)實(shí)現(xiàn)數(shù)據(jù)庫連接的上下文,目的是自動(dòng)獲取和釋放連接:

class _ConnectionCtx(object):

def __enter__(self):

global _db_ctx

self.should_cleanup = False

if not _db_ctx.is_init():

_db_ctx.init()

self.should_cleanup = True

return self

def __exit__(self, exctype, excvalue, traceback):

global _db_ctx

if self.should_cleanup:

_db_ctx.cleanup()

def connection():

return _ConnectionCtx()

定義了__enter__()和__exit__()的對(duì)象可以用于with語句,確保任何情況下__exit__()方法可以被調(diào)用。

把_ConnectionCtx的作用域作用到一個(gè)函數(shù)調(diào)用上,可以這么寫:

with connection():

do_some_db_operation()

但是更簡單的寫法是寫個(gè)@decorator:

@with_connection

def do_some_db_operation():

pass

這樣,我們實(shí)現(xiàn)select()、update()方法就更簡單了:

@with_connection

def select(sql, *args):

pass

@with_connection

def update(sql, *args):

pass

注意到Connection對(duì)象是存儲(chǔ)在_DbCtx這個(gè)threadlocal對(duì)象里的,因此,嵌套使用with connection()也沒有問題。_DbCtx永遠(yuǎn)檢測當(dāng)前是否已存在Connection,如果存在,直接使用,如果不存在,則打開一個(gè)新的Connection。

對(duì)于transaction也是類似的,with transaction()定義了一個(gè)數(shù)據(jù)庫事務(wù):

with db.transaction():

db.select('...')

db.update('...')

db.update('...')

函數(shù)作用域的事務(wù)也有一個(gè)簡化的@decorator:

@with_transaction

def do_in_transaction():

pass

事務(wù)也可以嵌套,內(nèi)層事務(wù)會(huì)自動(dòng)合并到外層事務(wù)中,這種事務(wù)模型足夠滿足99%的需求。

事務(wù)嵌套比Connection嵌套復(fù)雜一點(diǎn),因?yàn)槭聞?wù)嵌套需要計(jì)數(shù),每遇到一層嵌套就+1,離開一層嵌套就-1,最后到0時(shí)提交事務(wù):

class _TransactionCtx(object):

def __enter__(self):

global _db_ctx

self.should_close_conn = False

if not _db_ctx.is_init():

_db_ctx.init()

self.should_close_conn = True

_db_ctx.transactions = _db_ctx.transactions + 1

return self

def __exit__(self, exctype, excvalue, traceback):

global _db_ctx

_db_ctx.transactions = _db_ctx.transactions - 1

try:

if _db_ctx.transactions==0:

if exctype is None:

self.commit()

else:

self.rollback()

finally:

if self.should_close_conn:

_db_ctx.cleanup()

def commit(self):

global _db_ctx

try:

_db_ctx.connection.commit()

except:

_db_ctx.connection.rollback()

raise

def rollback(self):

global _db_ctx

_db_ctx.connection.rollback()

最后,把select()和update()方法實(shí)現(xiàn)了,db模塊就完成了。

更多信息請(qǐng)查看IT技術(shù)專欄

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:在Python中編寫數(shù)據(jù)庫模塊的教程
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2026上岸·考公考編培訓(xùn)報(bào)班

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
久久综合九色99| 亚洲国产一区二区视频| 亚洲一区二区三区在线观看视频 | 欧美诱惑福利视频| 亚洲一区三区视频在线观看 | 欧美精品成人在线| 久久视频免费观看| 久久精品91久久久久久再现| 亚洲一二区在线| 亚洲影院色在线观看免费| 在线综合+亚洲+欧美中文字幕| 永久免费毛片在线播放不卡| 韩日精品中文字幕| 一色屋精品亚洲香蕉网站| 国产一区二区毛片| 国产日韩精品在线| 国产亚洲一级| 国内激情久久| 亚洲国产欧美日韩精品| 亚洲人精品午夜| 一区二区三区久久精品| 亚洲在线成人精品| 久久精品成人一区二区三区蜜臀| 欧美一区二区私人影院日本| 欧美亚洲网站| 免费成人高清在线视频| 欧美激情第4页| 欧美三区美女| 国产日产精品一区二区三区四区的观看方式 | 久久精品综合一区| 久久午夜av| 欧美成人精品福利| 欧美日韩情趣电影| 国产精品入口| 好看不卡的中文字幕| 91久久黄色| 亚洲永久精品大片| 久久久天天操| 欧美日韩免费一区二区三区| 国产精品综合网站| 亚洲国产精品一区二区久| 日韩亚洲欧美成人| 羞羞色国产精品| 久久躁日日躁aaaaxxxx| 欧美网站在线观看| 黄色成人在线网址| 亚洲视频在线免费观看| 久久久久国产精品人| 欧美日韩成人在线观看| 国产亚洲毛片在线| 日韩一区二区免费高清| 久久精品二区亚洲w码| 欧美日本在线看| 激情小说亚洲一区| 亚洲欧美国产另类| 欧美日本不卡高清| 一区二区三区我不卡| 欧美激情免费观看| 国产精品www994| 一区精品在线| 亚洲欧美中文日韩在线| 欧美本精品男人aⅴ天堂| 国产精品一区二区视频| 亚洲精品国产欧美| 欧美在线视频免费观看| 欧美另类高清视频在线| 韩日欧美一区二区三区| 亚洲欧美在线aaa| 欧美日韩三级视频| 在线观看亚洲视频| 欧美在线你懂的| 国产精品免费视频xxxx| 亚洲欧洲日韩在线| 久久综合国产精品| 国产一区美女| 亚洲欧美影音先锋| 欧美午夜女人视频在线| 亚洲欧洲精品一区二区三区波多野1战4 | 日韩亚洲视频| 蜜臀91精品一区二区三区| 国产伦精品一区二区三区照片91| 亚洲精品乱码久久久久久黑人 | 欧美另类女人| 亚洲精品久久久久久久久久久久久 | 欧美在线精品免播放器视频| 国产精品草草| 一区二区三区黄色| 欧美日韩1区2区| 亚洲国产网站| 免费在线成人av| 亚洲福利一区| 欧美xart系列在线观看| 亚洲国产天堂久久综合| 另类尿喷潮videofree| 在线观看一区二区视频| 久久久噜噜噜久久| 在线观看亚洲专区| 欧美大片在线观看一区| 亚洲毛片在线观看| 欧美日韩一区二区三区四区在线观看| 亚洲精品一区二区在线| 欧美激情偷拍| 亚洲一区二区三区777| 国产精品免费视频观看| 欧美亚洲一区在线| 一区二区三区国产精品| 久久亚洲精品视频| 亚洲国产精品视频| 欧美国产日韩一二三区| 99天天综合性| 国产精品免费在线| 欧美在线视频日韩| 韩日成人av| 欧美成人国产va精品日本一级| 一区二区三区免费看| 国产精品www色诱视频| 欧美三级日韩三级国产三级| 女同性一区二区三区人了人一| 国语自产偷拍精品视频偷 | 欧美人妖另类| 亚洲老司机av| 国产精品色婷婷| 久久久夜精品| 亚洲精品中文字幕在线| 国产精品欧美一区喷水 | 日韩视频免费大全中文字幕| 欧美午夜精品电影| 久久精品首页| 亚洲九九九在线观看| 国产精品尤物| 欧美高清视频在线播放| 中文国产亚洲喷潮| 蜜桃av一区二区在线观看| 亚洲欧洲一区二区三区| 欧美激情一区二区久久久| 在线精品亚洲| 久久综合狠狠综合久久综合88| 1024国产精品| 国产精品久久久久77777| 久久久久久久999精品视频| 亚洲人永久免费| 国产精品夜色7777狼人 | 国产精品a级| 久久久噜噜噜久噜久久| 99在线精品免费视频九九视| 国产亚洲一区二区精品| 国产精品福利影院| 欧美暴力喷水在线| 欧美一区午夜视频在线观看| 亚洲精品久久久蜜桃| 国产亚洲一区在线播放| 国产精品va在线播放我和闺蜜| 久久人人97超碰国产公开结果 | 欧美日本国产在线| 久久高清国产| 亚洲一级黄色| 亚洲欧洲日本mm| 狠狠色狠狠色综合日日小说| 国产精品xxxav免费视频| 免费在线看一区| 性欧美精品高清| 宅男噜噜噜66国产日韩在线观看| 黄色成人免费观看| 国产精品一区二区a| 欧美午夜精品久久久久久人妖| 欧美成人一区二区三区在线观看 | 久久se精品一区精品二区| 99精品黄色片免费大全| 久久精品在这里| 亚洲视频久久| 亚洲精品在线三区| 亚洲福利电影| 永久域名在线精品| 国产一级精品aaaaa看| 欧美无砖砖区免费| 欧美四级伦理在线| 欧美日韩国产成人在线91| 欧美成人69av| 欧美xx视频| 欧美国产欧美综合| 欧美大片免费观看| 欧美国产一区二区在线观看| 欧美高清视频一区| 欧美日韩国产首页| 国产精品s色| 国产精品最新自拍| 国产精品久久久免费| 国产精品久久中文| 国产伦精品一区二区三区免费迷| 国产精品国产三级国产aⅴ无密码| 欧美日韩直播| 国产伦精品一区二区三区免费迷| 国产精品美女久久福利网站| 国产精品久久久久久久久久久久| 国产精品久久中文| 国产偷久久久精品专区| 在线不卡欧美| 一本色道88久久加勒比精品| 亚洲欧美精品伊人久久| 久久精品亚洲精品|