数据库
Web.py 更多关于数据库的操作:http://webpy.org/cookbook/index.zh-cn
注意:在你开始连接数据库之前,请先安装正确的数据库驱动。比如 MySQLdb、psycopg2。如果需要尝试连接 池(database pool)功能,还得装下DBUtils。这几个模块都可以通过easy_install 或者 pip 来安装。
连接数据库:
1 import web 2 db = web.database(dbn=\'postgres\', db=\'mydata\', user=\'dbuser\', pw=\'\')
操作 数据库 示例
select 查询 # 查询表 entries = db.select(\'mytable\') # where 条件 myvar = dict(name="Bob") results = db.select(\'mytable\', myvar, where="name = $name") results = db.select(\'mytable\', where="id>100") # 查询具体列 results = db.select(\'mytable\', what="id,name") # order by results = db.select(\'mytable\', order="post_date DESC") # group results = db.select(\'mytable\', group="color") # limit results = db.select(\'mytable\', limit=10) # offset results = db.select(\'mytable\', offset=10) 更新 db.update(\'mytable\', where="id = 10", value1 = "foo") 删除 db.delete(\'mytable\', where="id=10") 复杂查询 # count results = db.query("SELECT COUNT(*) AS total_users FROM users") print results[0].total_users # join results = db.query("SELECT * FROM entries JOIN users WHERE entries.author_id = users.id") # 防止SQL注入可以这么干 results = db.query("SELECT * FROM users WHERE id=$id", vars={\'id\':10}) 多数据库操作 (web.py大于0.3) db1 = web.database(dbn=\'mysql\', db=\'dbname1\', user=\'foo\') db2 = web.database(dbn=\'mysql\', db=\'dbname2\', user=\'foo\') print db1.select(\'foo\', where=\'id=1\') print db2.select(\'bar\', where=\'id=5\') 事务 t = db.transaction() try: db.insert(\'person\', name=\'foo\') db.insert(\'person\', name=\'bar\') except: t.rollback() raise else: t.commit() # Python 2.5+ 可以用with from __future__ import with_statement with db.transaction(): db.insert(\'person\', name=\'foo\') db.insert(\'person\', name=\'bar\')
现在,在数据库里创建一个简单的表:
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\');
回到 code.py,修改GET 方法如下:
1 def GET(self): 2 todos = db.select(\'todo\') 3 print render.index(todos)
修改urls 变量:
1 urls = ( 2 \'/\', \'index\')
重新编辑index.html 文件如下:
1 $def with (todos) 2 <ul> 3 $for todo in todos: 4 <li id="t$todo.id">$todo.title</li> 5 </ul>
现在,可以访问”/“,如果显示”Learn web.py“,则祝贺你成功了!
现在,再让我们看看如何向数据库写入。
在index.html 文件的尾部添加如下内容:
1 <form method="post" action="add"> 2 <p> 3 <input type="text" name="title" /> 4 <input type="submit" value="Add" /> 5 </p> 6 </form>
修改code.py 文件的urls 变量如下:
1 urls = ( 2 \'/\', \'index\', 3 \'/add\', \'add\' 4 )
在code.py 里添加一个类:
1 class add: 2 def POST(self): 3 i = web.input() 4 n = db.insert(\'todo\', title=i.title) 5 web.seeother(\'/\')
web.input 使你能够方便地访问用户通过表单提交上来的变量。db.insert 用于向数据库的 “todo” 表插入数据,并且返回新插入行的ID。web.seeother 用于重转向到”/“。
提示:对于数据库的操作,还有db.transact(), db.commit(), db.rollback(),db.update()。
在web.py 里,还有web.input,web.query 和其它的函数,返回”Storage objects”,可以像字典型类(dictionaries) 的使用。