注意: 在你開(kāi)始使用數(shù)據(jù)庫(kù)之前,確保你已經(jīng)安裝了合適的數(shù)據(jù)庫(kù)訪問(wèn)庫(kù)。比如對(duì)于MySQL數(shù)據(jù)庫(kù),使用 pymysql,對(duì)于Postgres數(shù)據(jù)庫(kù)使用psycopg2。
首先你需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)庫(kù)對(duì)象。
db = web.database(dbn='postgres', user='username', pw='password', db='dbname')
(根據(jù)需要修改這里 – 尤其是username 、 password 、 dbname – 。 MySQL用戶(hù)還需要把 dbn 定義改為 mysql。)
這就是所有你需要做的 – web.py將會(huì)自動(dòng)處理與數(shù)據(jù)庫(kù)的連接和斷開(kāi)。
使用的的數(shù)據(jù)庫(kù)引擎管理工具,在你的庫(kù)中創(chuàng)建一個(gè)簡(jiǎn)單的表:
CREATE TABLE todo (
id serial primary key,
title text,
created timestamp default now(),
done boolean default 'f' );
然后初始化行:
INSERT INTO todo (title) VALUES ('Learn web.py'); 我們回來(lái)繼續(xù)編輯 code.py ,把 index.GET 改成下面的樣子,替換整個(gè)函數(shù):
def GET(self):
todos = db.select('todo')
return render.index(todos)
然后把URL列表改回來(lái),只保留 /:
'/', 'index',
像這樣編輯并替換 index.html 的全部?jī)?nèi)容:
$def with (todos)
<ul>
$for todo in todos:
<li id="t$todo.id">$todo.title</li>
</ul>
再訪問(wèn)你的網(wǎng)站,然后你可以看到你的todo item: “Learn web.py”。恭喜你!你已經(jīng)完整地寫(xiě)好了一個(gè)可以從數(shù)據(jù)庫(kù)讀取數(shù)據(jù)的程序?,F(xiàn)在讓我們同樣再寫(xiě)一個(gè)可以把數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)的程序。
在 index.html尾部添加:
<form method="post" action="add">
<p><input type="text" name="title" /> <input type="submit" value="Add" /></p>
</form>
然后把你的URL列表改為:
'/', 'index',
'/add', 'add'
(你必須要非常小心那些逗號(hào)。如果你省略他們,Python會(huì)把所有字符串連接起來(lái),變成 '/index/addadd')
現(xiàn)在添加另一個(gè)類(lèi):
class add:
def POST(self):
i = web.input()
n = db.insert('todo', title=i.title)
raise web.seeother('/')
(注意現(xiàn)在我們正在使用 POST)
web.input 可以讓你訪問(wèn)用戶(hù)通過(guò)form提交的任何數(shù)據(jù)。
注意: 如果要訪問(wèn)多個(gè)相同名字的字段,請(qǐng)使用list的格式(比如:一串name=”name”的多選框):
post_data=web.input(name=[])
db.insert 把數(shù)據(jù)插入數(shù)據(jù)表 todo ,然后把新的行號(hào)返回給你。 seeother 把用戶(hù)重定向到指定的URL。
一些快速補(bǔ)充說(shuō)明: db.update 與 db.insert 差不多,除了它返回的行號(hào)是直接從sql語(yǔ)句里面提取的(WHERE ID=2)。
web.input、 db.query已經(jīng)其他web.py中的函數(shù)返回”Storage objects”,這些東西就像字典,你除了可以 d['foo']之外,你還可以 d.foo。這可以讓代碼更加干凈。
更多建議: