導航:首頁 > 編程語言 > python資料庫適配器

python資料庫適配器

發布時間:2023-03-29 03:38:15

⑴ 使用python連接mysql資料庫需要裝什麼驅動

1 python3.5 連接MySQL資料庫需要安裝耐滾PyMysql插件
插件下載地址:昌謹余https://pypi.python.org/pypi/PyMySQL#downloads
代碼示例:

import pymysql
conn = pymysql.connect(host=』晌嫌localhost』, port=3306,user=』root』,passwd=』rusky』,db=』mysql』,charset=』UTF8』)
cur = conn.cursor()
cur.execute(「select version()」)
for i in cur:
print(i)
cur.close()
conn.close()

⑵ python web開發用哪個框架比較好

(1)Django。Django的文檔最完善、市場佔有率最高、招聘職位最多估計大家都沒什麼意見。完美的文檔,Django的成功,我覺得很大一部分原因要歸功於Django近乎完美的官方文檔(包括Django book)。全套的解決方案,Django象Rails一樣,提供全套的解決方案(full-stack framework + batteries included),基本要什麼有什麼(比如:cache、session、feed、orm、geo、auth),而且全部Django自己造,開發網 站應手的工具Django基本都給你做好了,因此開發效率是不用說的,出了問題也算好找,不在你的代碼里就在Django的源碼里。
(2)Pylons和Django的設計理念完全不同,Pylons本身只有兩千行左右的Python代碼,不過它還附帶有一些幾乎就是Pylons御用 的第三方模塊。Pylons只提供一個架子和可選方案,你可以根據自己的喜好自由的選擇Template、ORM、form、auth等組件,系統高度可 定製。我們常說Python是一個膠水語言(glue language),那麼我們完全可以說Pylons就是一個用膠水語言設計的膠水框架。
(3)Tornado即是一個Web server(對此本文不作詳述),同時又是一個類web.py的micro-framework,作為框架Tornado的思想主要來源於Web.py,大家在Web.py的網站首頁也可以看到Tornado的大佬Bret Taylor的這么一段話(他這里說的FriendFeed用的框架跟Tornado可以看作是一個東西):
(4)Bottle和Flask作為新生一代Python框架的代表,挺有意思的是都採用了decorator的方式配置URL路由。
(5)Flask 精簡
(6)web.py 非常精簡

⑶ 關於python連接MySQL報錯問題。

你要連接本地資料庫,先要在本地上開數據服務(安裝mysql,一般是自動開的),看你連接的資料庫是TestDB,你要看下,你裝的mysql下,有沒這個資料庫啊,沒有的話話,肯定是連接失敗的。

⑷ gevent,eventlet,Twisted,Tornado各有什麼區別和優劣

先說純python的tornado,tornado應該是最簡單的基於epoll(或kqueue)的httpserver和httpclient,說白了就是封裝了python標准庫的socket和select.epoll(或select.kqueue),所以你也可以照著tornado實現一個媲美nginx的httpserver。當襲肢然,為了利用好這個基於epoll的的server,你需要在io處搞個回調函數,只有當你這個io結束,才執行回調函數,如果你這個io不結束,你就執行了回調函數(同步的寫法),產生的後果當然是阻塞(因為一直在等你的io結束),所以用了epoll,你就需要層層回調,代碼肯定很難看的,tornado為了解決這個問題,就加了個裝飾器以及利用了python的yield關鍵字,裝飾器的內部實現的函數名字就叫replace_callback,顧名思義,就是替換回調,yield會使函數或方法凍結,相當於你搞了個回調,拍隱世但看起來像同步的,當然,這個寫法也有很不方便的地方,但已經比回調爽多了。
tornado雖然是最簡單的基於epoll的httpserver,但坑也非常明顯,前面說了,tornado僅僅封裝了socket和select.epoll,這就導致,木有python資料庫適配器能和tornado無縫對接,只有兩種情況下滿足其一才能把資料庫適配器改造成tornado能用的,第一:這個適配器是純python的,關鍵是socket通信是純python的;第二:這個適配器自帶非同步,例如psycopg2。可是就算滿足了上面的情況,你還得用tornado自帶的ioloop和iostream進行封裝,相當麻煩。
gevent就不一樣攜搏了,作為另一個python協程庫,裡面封裝了C,這導致他不是純python的,無法適用pypy(除非提供cffi介面),gevent的特點是自己搞了個socket和select,通過monkey_patch的方法幹掉了python自帶的socket和select,從最底層就開始玩epoll,用gevent做聊天室,不用像tornado那樣還需寫回調函數或yield,只需要調用gevent.event的wait和set方法。
gevent調用資料庫遠比tornado簡單,雖然它對適配器的要求和tornado一樣,但不需要你自己寫代碼封裝(或很少的代碼)

⑸ 後端編程Python3-資料庫編程

對大多數軟體開發者而言,術語資料庫通常是指RDBMS(關系資料庫管理系統), 這些系統使用表格(類似於電子表格的網格),其中行表示記錄,列表示記錄的欄位。表格及其中存放的數據是使用SQL (結構化査詢語言)編寫的語句來創建並操縱的。Python提供了用於操縱SQL資料庫的API(應用程序介面),通常與作為標準的SQLite 3資料庫一起發布。

另一種資料庫是DBM (資料庫管理器),其中存放任意數量的鍵-值項。Python 的標准庫提供了幾種DBM的介面,包括某些特定於UNIX平台的。DBM的工作方式 與Python中的字典類似,區別在於DBM通常存放於磁碟上而不是內存中,並且其鍵與值總是bytes對象,並可能受到長度限制。本章第一節中講解的shelve模塊提供了方便的DBM介面,允許我們使用字元串作為鍵,使用任意(picklable)對象作為值。

如果可用的 DBM 與 SQLite 資料庫不夠充分,Python Package Index, pypi.python.org/pypi中提供了大量資料庫相關的包,包括bsddb DBM ("Berkeley DB"),對象-關系映射器,比如SQLAlchemy (www.sqlalchemy.org),以及流行的客戶端/伺服器數據的介面,比如 DB2、Informix、Ingres、MySQL、ODBC 以及 PostgreSQL。

本章中,我們將實現某程序的兩個版本,該程序用於維護一個DVD列表,並追蹤每個DVD的標題、發行年份、時間長度以及發行者。該程序的第一版使用DBM (通過shelve模塊)存放其數據,第二版則使用SQLite資料庫。兩個程序都可以載入與保存簡單的XML格式,這使得從某個程序導出DVD數據並將其導入到其他程序成為可能。與DBM版相比,基於SQL的程序提供了更多一些的功能,並且其數據設計也稍干凈一些。

12.1 DBM資料庫

shelve模塊為DBM提供了一個wrapper,藉助於此,我們在與DBM交互時,可以將其看做一個字典,這里是假定我們只使用字元串鍵與picklable值,實際處理時, shelve模塊會將鍵與值轉換為bytes對象(或者反過來)。

由於shelve模塊使用的是底層的DBM,因此,如果其他計算機上沒有同樣的DBM,那麼在某台計算機上保存的DBM文件在其他機器上無法讀取是可能的。為解決這一問題,常見的解決方案是對那些必須在機器之間可傳輸的文件提供XML導入與導出功能,這也是我們在本節的DVD程序dvds-dbm.py中所做的。

對鍵,我們使用DVD的標題;對值,則使用元組,其中存放發行者、發行年份以及時間。藉助於shelve模塊,我們不需要進行任何數據轉換,並可以把DBM對象當做一個字典進行處理。

程序在結構上類似於我們前面看到的那種菜單驅動型的程序,因此,這里主要展示的是與DBM程序設計相關的那部分。下面給出的是程序main()函數中的一部分, 忽略了其中菜單處理的部分代碼。

db = None

try:

db = shelve.open(filename, protocol=pickle.HIGHEST_PROTOCOL)

finally:

if db is not None:

db.dose()

這里我們已打開(如果不存在就創建)指定的DBM文件,以便於對其進行讀寫操作。每一項的值使用指定的pickle協議保存為一個pickle,現有的項可以被讀取, 即便是使用更底層的協議保存的,因為Python可以計算出用於讀取pickle的正確協議。最後,DBM被關閉——其作用是清除DBM的內部緩存,並確保磁碟文件可以反映出已作的任何改變,此外,文件也需要關閉。

該程序提供了用於添加、編輯、列出、移除、導入、導出DVD數據的相應選項。除添加外,我們將忽略大部分用戶介面代碼,同樣是因為已經在其他上下文中進行了展示。

def add_dvd(db):

title = Console.get_string("Title", "title")

if not title:

return

director = Console.get_string("Director", "director")

if not director:

return

year = Console.get_integer("Year", "year",minimum=1896,

maximum=datetime,date.today().year)

ration = Console.get_integer("Duration (minutes)", "minutes「, minimum=0, maximum=60*48)

db[title] = (director, year, ration)

db.sync()

像程序菜單調用的所有函數一樣,這一函數也以DBM對象(db)作為其唯一參數。該函數的大部分工作都是獲取DVD的詳細資料,在倒數第二行,我們將鍵-值項存儲在DBM文件中,DVD的標題作為鍵,發行者、年份以及時間(由shelve模塊pickled在一起)作為值。

為與Python通常的一致性同步,DBM提供了與字典一樣的API,因此,除了 shelve.open() 函數(前面已展示)與shelve.Shelf.sync()方法(該方法用於清除shelve的內部緩存,並對磁碟上文件的數據與所做的改變進行同步——這里就是添加一個新項),我們不需要學習任何新語法。

def edit_dvd(db):

old_title = find_dvd(db, "edit")

if old_title is None:

return

title = Console.get.string("Title", "title", old_title)

if not title:

return

director, year, ration = db[old_title]

...

db[title]= (director, year, ration)

if title != old_title:

del db[old_title]

db.sync()

為對某個DVD進行編輯,用戶必須首先選擇要操作的DVD,也就是獲取DVD 的標題,因為標題用作鍵,值則用於存放其他相關數據。由於必要的功能在其他場合 (比如移除DVD)也需要使用,因此我們將其實現在一個單獨的find_dvd()函數中,稍後將査看該函數。如果找到了該DVD,我們就獲取用戶所做的改變,並使用現有值作為默認值,以便提高交互的速度。(對於這一函數,我們忽略了大部分用戶介面代碼, 因為其與添加DVD時幾乎是相同的。)最後,我們保存數據,就像添加時所做的一樣。如果標題未作改變,就重寫相關聯的值;如果標題已改變,就創建一個新的鍵-值對, 並且需要刪除原始項。

def find_dvd(db, message):

message = "(Start of) title to " + message

while True:

matches =[]

start = Console.get_string(message, "title")

if not start:

return None

for title in db:

if title.lower().startswith(start.lower()):

matches.append(title)

if len(matches) == 0:

print("There are no dvds starting with", start)

continue

elif len(matches) == 1:

return matches[0]

elif len(matches) > DISPLAY_LIMIT:

print("Too many dvds start with {0}; try entering more of the title".format(start)

continue

else:

matches = sorted(matches, key=str.lower)

for i, match in enumerate(matches):

print("{0}: {1}".format(i+1, match))

which = Console.get_integer("Number (or 0 to cancel)",

"number", minimum=1, maximum=len(matches))

return matches[which - 1] if which != 0 else None

為盡可能快而容易地發現某個DVD,我們需要用戶只輸入其標題的一個或頭幾個字元。在具備了標題的起始字元後,我們在DBM中迭代並創建一個匹配列表。如果只有一個匹配項,就返回該項;如果有幾個匹配項(但少於DISPLAY_LIMIT, 一個在程序中其他地方設置的整數),就以大小寫不敏感的順序展示所有這些匹配項,並為每一項設置一個編號,以便用戶可以只輸入編號就可以選擇某個標題。(Console.get_integer()函數可以接受0,即便最小值大於0,以便0可以用作一個刪除值。通過使用參數allow_zero=False, 可以禁止這種行為。我們不能使用Enter鍵,也就是說,沒有什麼意味著取消,因為什麼也不輸入意味著接受默認值。)

def list_dvds(db):

start =」"

if len(db)> DISPLAY.LIMIT:

start = Console.get_string(「List those starting with [Enter=all]」, "start」)

print()

for title in sorted(db, key=str.lower):

if not start or title.Iower().startswith(start.lower()):

director, year, ration = db[title]

print("{title} ({year}) {ration} minute{0}, by "

"{director}".format(Util.s(ration),**locals()))

列出所有DVD (或者那些標題以某個子字元串引導)就是對DBM的所有項進行迭代。

Util.s()函數就是簡單的s = lambda x: "" if x == 1 else "s",因此,如果時間長度不是1分鍾,就返回"s"。

def remove_dvd(db):

title = find_dvd(db, "remove")

if title is None:

return

ans = Console.get_bool("Remove {0}?".format(title), "no")

if ans:

del db[title]

db.sync()

要移除一個DVD,首先需要找到用戶要移除的DVD,並請求確認,獲取後從DBM中刪除該項即可。

到這里,我們展示了如何使用shelve模塊打開(或創建)一個DBM文件,以及如何向其中添加項、編輯項、對其項進行迭代以及移除某個項。

遺憾的是,在我們的數據設計中存在一個瑕疵。發行者名稱是重復的,這很容易導致不一致性,比如,發行者Danny DeVito可能被輸入為"Danny De Vito",用於 一個電影;也可以輸入為「Danny deVito",用於另一個。為解決這一問題,可以使用兩個DBM文件,主DVD文件使用標題鍵與(年份,時間長度,發行者ID)值; 發行者文件使用發行者ID (整數)鍵與發行者名稱值。下一節展示的SQL資料庫 版程序將避免這一瑕疵,這是通過使用兩個表格實現的,一個用於DVD,另一個用於發行者。

12.2 SQL資料庫

大多數流行的SQL資料庫的介面在第三方模塊中是可用的,Python帶有sqlite3 模塊(以及SQLite 3資料庫),因此,在Python中,可以直接開始資料庫程序設計。SQLite是一個輕量級的SQL資料庫,缺少很多諸如PostgreSQL這種資料庫的功能, 但非常便於構造原型系統,並且在很多情況下也是夠用的。

為使後台資料庫之間的切換盡可能容易,PEP 249 (Python Database API Specification v2.0)提供了稱為DB-API 2.0的API規范。資料庫介面應該遵循這一規范,比如sqlite3模塊就遵循這一規范,但不是所有第三方模塊都遵循。API規范中指定了兩種主要的對象,即連接對象與游標對象。表12-1與表12-2中分別列出了這兩種對象必須支持的API。在sqlite3模塊中,除DB-API 2.0規范必需的之外,其連接對象與游標對象都提供了很多附加的屬性與方法。

DVD程序的SQL版本為dvds.sql.py,該程序將發行者與DVD數據分開存儲,以 避免重復,並提供一個新菜單,以供用戶列出發行者。該程序使用的兩個表格在圖12-1

def connect(filename):

create= not os.path.exists(filename)

db = sqlite3.connect(filename)

if create:

cursor = db.cursor()

cursor.execute("CREATE TABLE directors ("

"id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, "

"name TEXT UNIQUE NOT NULL)")

cursor.execute("CREATE TABLE dvds ("

"id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, "

"title TEXT NOT NULL, "

"year INTEGER NOT NULL,"

"ration INTEGER NOT NULL, "

"director_id INTEGER NOT NULL, 」

"FOREIGN KEY (director_id) REFERENCES directors)")

db.commit()

return db

sqlite3.connect()函數會返回一個資料庫對象,並打開其指定的資料庫文件。如果該文件不存在,就創建一個空的資料庫文件。鑒於此,在調用sqlite3.connect()之前,我們要注意資料庫是否是准備從頭開始創建,如果是,就必須創建該程序要使用的表格。所有査詢都是通過一個資料庫游標完成的,可以從資料庫對象的cursor()方法獲取。

注意,兩個表格都是使用一個ID欄位創建的,ID欄位有一個AUTOINCREMENT 約束——這意味著SQLite會自動為ID欄位賦予唯一性的數值,因此,在插入新記錄時,我們可以將這些欄位留給SQLite處理。

SQLite支持有限的數據類型——實際上就是布爾型、數值型與字元串——但使用數據'『適配器」可以對其進行擴展,或者是擴展到預定義的數據類型(比如那些用於日期與datetimes的類型),或者是用於表示任意數據類型的自定義類型。DVD程序並不需要這一功能,如果需要,sqlite3模塊的文檔提供了很多詳細解釋。我們使用的外部鍵語法可能與用於其他資料庫的語法不同,並且在任何情況下,只是記錄我們的意圖,因為SQLite不像很多其他資料庫那樣需要強制關系完整性,sqlite3另一點與眾不同的地方在於其默認行為是支持隱式的事務處理,因此,沒有提供顯式的「開始事務」 方法。

def add_dvd(db):

title = Console.get_string("Title", "title")

if not title:

return

director = Console.get_string("Director", "director")

if not director:

return

year = Console.get_integer("Year", "year」, minimum=1896,

maximum=datetime.date.today().year)

ration = Console.get_integer("Duration (minutes)", "minutes",

minimum=0,maximum=60*48)

director_id = get_and_set_director(db, director)

cursor = db.cursor()

cursor.execute("INSERT INTO dvds 」

"(title, year, ration, director_id)"

"VALUES (?, ?, ?, ?)",

(title, year, ration, director_id))

db.commit()

這一函數的開始代碼與dvds-dbm.py程序中的對應函數一樣,但在完成數據的收集後,與原來的函數有很大的差別。用戶輸入的發行者可能在也可能不在directors表格中,因此,我們有一個get_and_set_director()函數,在資料庫中尚無某個發行者時, 該函數就將其插入到其中,無論哪種情況都返回就緒的發行者ID,以便在需要的時候插入到dvds表。在所有數據都可用後,我們執行一條SQL INSERT語句。我們不需要指定記錄ID,因為SQLite會自動為我們提供。

在査詢中,我們使用問號(?)作為佔位符,每個?都由包含SQL語句的字元串後面的序列中的值替代。命名的佔位符也可以使用,後面在編輯記錄時我們將看到。盡管避免使用佔位符(而只是簡單地使用嵌入到其中的數據來格式化SQL字元串)也是可能的,我們建議總是使用佔位符,並將數據項正確編碼與轉義的工作留給資料庫模塊來完成。使用佔位符的另一個好處是可以提高安全性,因為這可以防止任意的SQL 被惡意地插入到一個査詢中。

def get_and_set_director(db, director):

director_id = get_director_id(db, director)

if directorjd is not None:

return director_id

cursor = db.cursor()

cursor.execute("lNSERT INTO directors (name) VALUES (?)」,(director,))

db.commit()

return get_director_id(db, director)

這一函數返回給定發行者的ID,並在必要的時候插入新的發行者記錄。如果某個記錄被插入,我們首先嘗試使用get_director_id()函數取回其ID。

def get_director_id(db, director):

cursor = db.cursor()

cursor.execute("SELECT id FROM directors WHERE name=?",(director,))

fields = cursor.fetchone()

return fields[0] if fields is not None else None

get_director_id()函數返回給定發行者的ID,如果資料庫中沒有指定的發行者,就返回None。我們使用fetchone()方法,因為或者有一個匹配的記錄,或者沒有。(我們知道,不會有重復的發行者,因為directors表格的名稱欄位有一個UNIQUE約束,在任何情況下,在添加一個新的發行者之前,我們總是先檢査其是否存在。)這種取回方法總是返回一個欄位序列(如果沒有更多的記錄,就返回None)。即便如此,這里我們只是請求返回一個單獨的欄位。

def edit_dvd(db):

title, identity = find_dvd(db, "edit")

if title is None:

return

title = Console.get_string("Title","title", title)

if not title:

return

cursor = db.cursor()

cursor.execute("SELECT dvds.year, dvds.ration, directors.name"

「FROM dvds, directors "

"WHERE dvds.director_id = directors.id AND "

"dvds.id=:id", dict(id=identity))

year, ration, director = cursor.fetchone()

director = Console.get_string("Director", "director", director)

if not director:

return

year = Console,get_integer("Year","year", year, 1896,datetime.date.today().year)

ration = Console.get_integer("Duration (minutes)", "minutes",

ration, minimum=0, maximum=60*48)

director_id = get_and_set_director(db, director)

cursor.execute("UPDATE dvds SET title=:title, year=:year,"

"ration=:ration, director_id=:directorjd "

"WHERE id=:identity", locals())

db.commit()

要編輯DVD記錄,我們必須首先找到用戶需要操縱的記錄。如果找到了某個記錄,我們就給用戶修改其標題的機會,之後取回該記錄的其他欄位,以便將現有值作為默認值,將用戶的輸入工作最小化,用戶只需要按Enter鍵就可以接受默認值。這里,我們使用了命名的佔位符(形式為:name),並且必須使用映射來提供相應的值。對SELECT語句,我們使用一個新創建的字典;對UPDATE語句,我們使用的是由 locals()返回的字典。

我們可以同時為這兩個語句都使用新字典,這種情況下,對UPDATE語句,我們可以傳遞 dict(title=title, year=year, ration=ration, director_id=director_id, id=identity)),而非 locals()。

在具備所有欄位並且用戶已經輸入了需要做的改變之後,我們取回相應的發行者ID (如果必要就插入新的發行者記錄),之後使用新數據對資料庫進行更新。我們採用了一種簡化的方法,對記錄的所有欄位進行更新,而不僅僅是那些做了修改的欄位。

在使用DBM文件時,DVD標題被用作鍵,因此,如果標題進行了修改,我們就需要創建一個新的鍵-值項,並刪除原始項。不過,這里每個DVD記錄都有一個唯一性的ID,該ID是記錄初次插入時創建的,因此,我們只需要改變任何其他欄位的值, 而不需要其他操作。

def find_dvd(db, message):

message = "(Start of) title to " + message

cursor = db.cursor()

while True: .

start = Console.get_stnng(message, "title")

if not start:

return (None, None)

cursor.execute("SELECT title, id FROM dvds "

"WHERE title LIKE ? ORDER BY title」,

(start +"%",))

records = cursor.fetchall()

if len(records) == 0:

print("There are no dvds starting with", start)

continue

elif len(records) == 1:

return records[0]

elif len(records) > DISPLAY_LIMIT:

print("Too many dvds ({0}) start with {1}; try entering "

"more of the title".format(len(records),start))

continue

else:

for i, record in enumerate(records):

print("{0}:{1}".format(i + 1, record[0]))

which = Console.get_integer("Number (or 0 to cancel)",

"number", minimum=1, maximum=len(records))

return records[which -1] if which != 0 else (None, None)

這一函數的功能與dvdsdbm.py程序中的find_dvd()函數相同,並返回一個二元組 (DVD標題,DVD ID)或(None, None),具體依賴於是否找到了某個記錄。這里並不需要在所有數據上進行迭代,而是使用SQL通配符(%),因此只取回相關的記錄。

由於我們希望匹配的記錄數較小,因此我們一次性將其都取回到序列的序列中。如果有不止一個匹配的記錄,但數量上又少到可以顯示,我們就列印記錄,並將每條記錄附帶一個數字編號,以便用戶可以選擇需要的記錄,其方式與在dvds-dbm.py程序中所做的類似:

def list_dvds(db):

cursor = db.cursor()

sql = ("SELECT dvds.title, dvds.year, dvds.ration, "

"directors.name FROM dvds, directors "

"WHERE dvds.director_id = directors.id")

start = None

if dvd_count(db) > DISPLAY_LIMIT:

start = Console.get_string("List those starting with [Enter=all]", "start")

sql += " AND dvds.title LIKE ?"

sql += 」 ORDER BY dvds.title"

print()

if start is None:

cursor.execute(sql)

else:

cursor.execute(sql, (start +"%",))

for record in cursor:

print("{0[0]} ({0[1]}) {0[2]} minutes, by {0[3]}".format(record))

要列出每個DVD的詳細資料,我們執行一個SELECT査詢。該査詢連接兩個表,如果記錄(由dvd_count()函數返回)數量超過了顯示限制值,就將第2個元素添加到WHERE 分支,之後執行該査詢,並在結果上進行迭代。每個記錄都是一個序列,其欄位是與 SELECT査詢相匹配的。

def dvd_count(db):

cursor = db.cursor()

cursor.execute("SELECT COUNT(*) FROM dvds")

return cursor.fetchone()[0]

我們將這幾行代碼放置在一個單獨的函數中,因為我們在幾個不同的函數中都需要使用這幾行代碼。

我們忽略了 list_directors()函數的代碼,因為該函數在結構上與list_dvds()函數非常類似,只不過更簡單一些,因為本函數只列出一個欄位(name)。

def remove_dvd(db):

title, identity = find_dvd(db, "remove")

if title is None:

return

ans = Console.get_bool("Remove {0}?".format(title), "no")

if ans:

cursor = db.cursor()

cursor.execute("DELETE FROM dvds WHERE id=?", (identity,))

db.commit()

在用戶需要刪除一個記錄時,將調用本函數,並且本函數與dvds-dbm.py程序中 相應的函數是非常類似的。

到此,我們完全查閱了 dvds-sql.py程序,並且了解了如何創建資料庫表格、選取 記錄、在選定的記錄上進行迭代以及插入、更新與刪除記錄。使用execute()方法,我們可以執行底層資料庫所支持的任意SQL語句。

SQLite提供了比我們這里使用的多得多的功能,包括自動提交模式(以及任意其他類型的事務控制),以及創建可以在SQL查詢內執行的函數的能力。提供一個工廠函數並用於控制對每個取回的記錄返回什麼(比如,一個字典或自定義類型,而不是欄位序列)也是可能的。此外,通過傳遞「:memory:」作為文件名,創建內存中的SQLite 資料庫也是可能的。

以上內容部分摘自視頻課程05後端編程Python22 資料庫編程,更多實操示例請參照視頻講解。跟著張員外講編程,學習更輕松,不花錢還能學習真本領。

⑹ 誰能簡單說一下python幾個框架的特點吧

1.CubicWeb
CubicWeb的最重要的功能是其代碼的可重用性,由一個個代碼單元組成。它靈活又強大,並且還有一些特別的功能,包括RQL查詢語言和支持有效編碼的語義視圖功能。這是語義Web應用程序的最佳解決方案,並且提供理想的環境。
作為一個程序員,我們必須了解Python這門編程語言的靈活和強大。框架的選擇取決於Web應用程序的使用目的和復雜程度。測量項目所需的負荷、可擴展性和效率是關鍵。

官方網站:http://www.cubicweb.org/
2.Zope2
Zope是不同Web框架集合在一起的完整家庭。與其他框架相比,zope2在當前的開發環境中對於內容管理系統是相當有限的。 Zope工具包是一個很好的庫資源,允許使用重用代碼和不同的庫。

官方網站:https://pypi.python.org/pypi/Zope2
3.web2py
web2py最重要的因素是其外部零依賴,可以創建、復原、管理和修改在瀏覽器中的應用程序。對於一些簡單的web開發任務,大部分都可以自動化快速開發。程序員甚至不需要再准備單一的開發、調試、測試、部署和資料庫處理的封裝包。內置的Web界面中這些都有,在使用之前也不需要進行安裝。

官方網站:http://www.web2py.com/
4.TurboGears
TurboGears也稱為是框架的終結者,因為它雖然有著其他Python框架都有的功能,卻不像其他框架那樣有局限性。它甚至能適用於簡單的微架構項目。它給人的感覺就不像是工作在框架上,而像是在寫新的功能。你可以在幾分鍾之內可以創建一個read-to-extend應用,並且我們可以在網上找到大量的教程。

官方網站:http://www.turbogears.org/
5.Pylons
靈活性是pylons框架的主要特點之一。它可以將不同Python框架提供的某些最好功能,整合到同一個地方。Pyramid是pylons的第一批產品之一,它把重點放在了快速和靈活開發實踐上。你可以挑選任何你認為可以提高Web開發效率的功能整合到一起。

官方網站:http://www.pylonsproject.org/
6.Grok
它由Zope工具包提供支持,並且一開始的時候是作為一個易擴展的Zope工具箱,為了方便那些菜鳥程序員的使用而開發 的。對於Web應用,Grok不但能提供多個構件,還有一個隨時可以提供支持的很好社區。它提供了一種更為簡單和靈活的學習Python的模式。它配備的可DRY方法使得它成為了一個很好的工具。

官方網站:http://grok.zope.org/
7.Web.py
之所以說這是一款非常獨特的框架,主要是因為它的簡單性和功能強大的開發能力。你可以用Python語言舒舒服服地編寫web應用程序。你會因為它的零局限性和易用性喜歡上web.py。有些程序員可能會發現它對功能的限制比較少,因為它預留了整合的空間,所以你不必一下子載入所有的功能,尤其是那些你並不需要的。

官方網站:http://webpy.org/
8.Pyramid
Pyramid以其高效率和快節奏的開發能力而出名。這個框架最妙的是包含了一些Python,Perl和Ruby提供的最獨特的功能。此開源Web框架有一個獨立於平台的MVC結構,提供了開發的最簡途徑。此外,它還是高效開發重用代碼的首選平台之一。

官方網站:http://www.pylonsproject.org/projects/pyramid/about
9.CherryPy
CherryPy起源的其中一個最重要的原因是,它與Python兼容,並且它Python化的介面允許開發人員像Python提供的其他任何模塊一樣將其整合。另一個優秀的特點是能夠自定義各個功能,並配備了本地適配器(mod_python),使得它非常適合開發。它為每一個WSGI功能適配器提供支持,並允許CherryPy的廣泛實施。

官方網站:http://www.cherrypy.org/
10.Flask
Flask是一款可擴展卻又簡單的微架構。可能剛用的時候你會覺得它缺少某些功能,如表單驗證、資料庫抽象層、添加常用功能的第三方庫。但是,它允許擴展,使得它更易於添加所需的功能。它的有些功能如單元測試非常適用於開發,並且支持客戶端應用程序使用安全的cookies。它更適用於輕量級的應用程序和項目。

⑺ Python設計模式 - 適配器模式

'''

適配器模式:將一個類的介面轉換成客戶希望的另外一個介面。使得原本由於介面不兼容而不能一起工作的那些類可以一起工作。

應用場景:希望復用一些現存的類,但是介面又與復用環境要求不一致。

分類:類適配器(通過多重繼承)、對象適配器。

'''

class Dog(object):

    def __init__(self):

  答滾簡      self.name = "Dog"

    def bark(self):

        return "汪!"

class Cat(object):

    def __init__(self):

        self.name = "Cat"

    def meow(self):

        return "喵!"

class Human(object):

    def __init__(self):

        self.name = "Human"

    def speak(self):

        return "'你好'"

class Car(object):

    def __init__(self):

        self.name = "Car"

    def make_noise(self, octane_level):

     備型   return "引擎聲{0}".format("!" * octane_level)

class Adapter(object):

    def __init__(self, obj, **adapted_methods):

    清褲    """我們對象字典里設置適配的方法"""

        self.obj = obj

        '''update()方法添加鍵 - 值對到字典'''

        self.__dict__.update(adapted_methods)

    """我們可以通過重載__getattr__和__setattr__來攔截對成員的訪問或者作出一些自己希望的行為

     __getattr__ 在訪問對象訪問類中不存在的成員時會自動調用"""

    def __getattr__(self, attr):

        return getattr(self.obj, attr ,'沒有找到此屬性')

    def original_dict(self):

        """輸出對象的實例屬性"""

        return self.obj.__dict__

def main():

    """定義一個空對象列表"""

    objects = []

    dog = Dog()

    print(dog.__dict__)

    '''追加Adapter實例對象到列表'''

    objects.append(Adapter(dog, make_noise=dog.bark))

    '''Adapter實例屬性, 實例也有一個 __dict__特殊屬性,它是實例屬性構成的一個字典:'''

    '''__dict__ 返回的是一個字典,它的鍵(key)是屬性名,鍵值(value)是相應的屬性對象的數據值'''

    '''實例僅擁有數據屬性,它是與某個類的實例相關聯的數據值,這些值獨立於其他實例或類。當一個實例被釋放後,它的屬性同時也被清除了。'''

    print(objects[0].__dict__)

    print(objects[0].original_dict())

    print(objects[0].QQ)

    print(objects[0].make_noise())

    print("-----------------------------------------------")

    cat = Cat()

    objects.append(Adapter(cat, make_noise=cat.meow))

    print(objects[1].__dict__)

    print("-----------------------------------------------")

    human = Human()

    objects.append(Adapter(human, make_noise=human.speak))

    print(objects[2].__dict__)

    print("-----------------------------------------------")

    car = Car()

    objects.append(Adapter(car, make_noise=lambda: car.make_noise(5)))

    print(objects[3].__dict__)

    print("-----------------------------------------------")

    for obj in objects:

        print("一個 {0} 正在 {1}".format(obj.name, obj.make_noise()))

if __name__ == "__main__":

        main()

⑻ Python接入不同類型資料庫的通用介面方法

日常數據管理工作中,需要處理存儲在不同類型資料庫系統的數據。對這些數據的管理,常見的是使用Navicat,DBeaver等管理工具。在對大量數據分析時,需要提取到Python/R中進行處理。下面 探索 Python調用MySQL,MongoDB,InfluxDB等多種類型資料庫通用連接方法。實現方式是在Python中封裝各類資料庫介麵包。

實現後的效果:1.安全。介面信息封裝便於保密管理;2.復用。一次封裝,永久復用;3.上手快。方便不熟悉python和數據調用的同學,只會簡單的sql即可使用,省時省力。

下面以MySQL,MongoDB,InfluxDB為例定義介面方法,然後把它們封裝成1個通用方法。

mysql_get(sql,db):

mongo_get(sql,db):

influx_get(sql,db):

可以看到,以上函數共同調用的參數為sql和db。我們再增加一個參數db_type,將構造一個通用的方法對以上資料庫調用。

同理,其他類型的資料庫也可以加入到這個通用框架中,包括但不限於各類關系型,鍵值型,時序型資料庫。

⑼ python內置的資料庫要配什麼環境

python內置的資料庫要配系統環境。根據查詢相關公開信息,python內置的資料庫解壓完成需要配置系統環境才能啟動。Python是一種跨平台的計算機程序設計語言,是ABC語言的替代品,屬於面向對象的動態類型語言,最初被散枝搭設計用於編寫自動化腳本,隨著版本的不斷更新和搭族語言新功能的添加,越來越多被用於獨立的、大沖拿型項目的開發。python前景比較好,python是人工智慧首選的編程語言。

⑽ 如何在ubuntu 12.04下搭建Python Django環境

1. 檢查python是否安裝:直接在shell里輸入python,如果已經安裝了python,即可進入python bash,並看到版本號(如Python 2.7.3)

——在ubuntu中python應該是已經默認安裝好了

2. 安裝Django:

安裝官方發布版:在 htt p:/ /畝橘ww w.d jangoproje ct.c om/download/ 下載安裝包,解壓配念後進行安裝:

sudo python setup.py install

檢查Django是否安裝:在python shell中輸入:

>>> import django
>>> django.VERSION
如果已成功安裝,應該能看到(1, 5, 1, 'final', 0) 樣式的版本號

3. 安裝資料庫(MySQL)

直接在shell里輸入

sudo apt-get install mysql-server

即可安裝MySQL

中間會提示輸入密碼,可以輸入也可以不管它

檢查MySQL是否安裝:

netstat -tap|grep mysql

若成功安裝,應能看到 tcp 0 0 localhost:mysql *:* LISTEN 這樣的信息

然後就可以在shell中輸入

mysql -u root -p

進入MySQL shell (如果在安裝時設定了密碼,則需輸入密碼),進行各種資料庫操作了

4. 安裝 python-mysql適配器

sudo apt-get install python-mysqldb

5. 在django中配置資料庫

1) 打開settings.py , 找到這樣一段:

DATABASES = {

'default' : {

'ENGINE' : 'django.db.backends.' , # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.

'NAME' : '', # Or path to database file if using sqlite3.

'USER' : '', # Not used with sqlite3.

'PASSWORD' : '', # Not used with sqlite3.

'HOST' : '', # Set to empty string for localhost. Not used with sqlite3.

'PORT' : '', # Set to empty string for default. Not used with sqlite3.

}

}
2)將『ENGINE』配置為 django.db.backends.mysql

3)'NAME'』配置為欲選用的DB名稱,如mydb

4)'USER' 'PASSWORD' 輸入相應的用戶名和密碼

5)'HOST' 這個配置存疑,我把它培耐困空著好像也行。

6)測試配置:

在`` mysite`` 項目目錄下運行python shell

python manage.py shell

輸入下面這些命令來測試你的資料庫配置:

>>> from django.db import connection
>>> cursor = connection.cursor()
如果沒有顯示什麼錯誤信息,那麼你的資料庫配置是正確的。 否則,就得查看錯誤信息來糾正錯誤。

閱讀全文

與python資料庫適配器相關的資料

熱點內容
顯示加密服務超時 瀏覽:610
日語口譯pdf 瀏覽:432
外人如何評價身邊的程序員 瀏覽:105
霍夫曼編碼壓縮演算法 瀏覽:122
我想學習單片機 瀏覽:644
陳寶蓮拍過 瀏覽:336
遙調命令的設定命令實現過程 瀏覽:76
演算法中最壞情況都為多少 瀏覽:995
排序演算法圖形化展示 瀏覽:782
看電影免費網站入口 瀏覽:447
加密U盤啟動區和交換區格式化 瀏覽:247
求不需要下載播放器就能看的網站 瀏覽:828
日本重生電影在線 瀏覽:623
女的被一個小孩上了 瀏覽:948
macandroid找不到設備 瀏覽:514
漫威電影不能投屏了怎麼破 瀏覽:308
安卓qq最新版本怎麼解綁手機號 瀏覽:681
經典三極3d版古裝劇 瀏覽:172
phpcurljsonget 瀏覽:913
郝萬山pdf 瀏覽:86