tornado(八)

數據庫

與Django框架相比,Tornado沒有自帶ORM,對於數據庫須要本身去適配。咱們使用MySQL數據庫。html

在Tornado3.0版本之前提供tornado.database模塊用來操做MySQL數據庫,而從3.0版本開始,此模塊就被獨立出來,做爲torndb包單獨提供。torndb只是對MySQLdb的簡單封裝,不支持Python 3。python

torndb安裝

pip install torndb

鏈接初始化

咱們須要在應用啓動時建立一個數據庫鏈接實例,供各個RequestHandler使用。咱們能夠在構造Application的時候建立一個數據庫實例並做爲其屬性,而RequestHandler能夠經過self.application獲取其屬性,進而操做數據庫實例。mysql

import torndb class Application(tornado.web.Application): def __init__(self): handlers = [ (r"/", IndexHandler), ] settings = dict( template_path=os.path.join(os.path.dirname(__file__), "templates"), static_path=os.path.join(os.path.dirname(__file__), "statics"), debug=True, ) super(Application, self).__init__(handlers, **settings) # 建立一個全局mysql鏈接實例供handler使用 self.db = torndb.Connection( host="127.0.0.1", database="itcast", user="root", password="mysql" ) 

使用數據庫

新建數據庫與表:web

create database `itcast` default character set utf8; use itcast; create table houses ( id bigint(20) unsigned not null auto_increment comment '房屋編號', title varchar(64) not null default '' comment '標題', position varchar(32) not null default '' comment '位置', price int not null default 0, score int not null default 5, comments int not null default 0, primary key(id) )ENGINE=InnoDB default charset=utf8 comment='房屋信息表'; 

1. 執行語句

  • execute(query, parameters, *kwparameters) 返回影響的最後一條自增字段值
  • execute_rowcount(query, parameters, *kwparameters) 返回影響的行數

query爲要執行的sql語句,parameters與kwparameters爲要綁定的參數,如:sql

db.execute("insert into houses(title, position, price, score, comments) values(%s, %s, %s, %s, %s)", "獨立裝修小別墅", "緊鄰文津街", 280, 5, 128) 或 db.execute("insert into houses(title, position, price, score, comments) values(%(title)s, %(position)s, %(price)s, %(score)s, %(comments)s)", title="獨立裝修小別墅", position="緊鄰文津街", price=280, score=5, comments=128) 

執行語句主要用來執行非查詢語句。數據庫

class InsertHandler(RequestHandler): def post(self): title = self.get_argument("title") position = self.get_argument("position") price = self.get_argument("price") score = self.get_argument("score") comments = self.get_argument("comments") try: ret = self.application.db.execute("insert into houses(title, position, price, score, comments) values(%s, %s, %s, %s, %s)", title, position, price, score, comments) except Exception as e: self.write("DB error:%s" % e) else: self.write("OK %d" % ret) 

2. 查詢語句

  • get(query, parameters, *kwparameters) 返回單行結果或None,若出現多行則報錯。返回值爲torndb.Row類型,是一個類字典的對象,即同時支持字典的關鍵字索引和對象的屬相訪問。
  • query(query, parameters, *kwparameters) 返回多行結果,torndb.Row的列表。

以上一章節模板中的案例來演示,先修改一下index.html模板,將app

<span class="house-title">{{title_join(house["titles"])}}</span> 

改成框架

<span class="house-title">{{house["title"]}}</span> 

添加兩個新的handler:tornado

class GetHandler(RequestHandler): def get(self): """訪問方式爲http://127.0.0.1/get?id=111""" hid = self.get_argument("id") try: ret = self.application.db.get("select title,position,price,score,comments from houses where id=%s", hid) except Exception as e: self.write("DB error:%s" % e) else: print type(ret) print ret print ret.title print ret['title'] self.render("index.html", houses=[ret]) class QueryHandler(RequestHandler): def get(self): """訪問方式爲http://127.0.0.1/query""" try: ret = self.application.db.query("select title,position,price,score,comments from houses limit 10") except Exception as e: self.write("DB error:%s" % e) else: self.render("index.html", houses=ret)
相關文章
相關標籤/搜索