tornado 07mysqlORM - nuanxin1111/react GitHub Wiki
7 mysqlORM
7.1 ORM
到了目前为此,我们用了redis用于支持session,当然后续不仅仅用于session,mongodb用于了注册登录,我们接下来用mysql来做一个模块的讲解。
数据库表是一个二维表,包含多行多列。把一个表的内容用Python的数据结构表示出来的话,可以用一个list表示多行,list的每一个元素是tuple,表示一行记录,比如,包含id和name的user表:
[ ('1', 'Michael'), ('2', 'Bob'), ('3', 'Adam') ] Python的DB-API返回的数据结构就是像上面这样表示的。
但是用tuple表示一行很难看出表的结构。如果把一个tuple用class实例来表示,就可以更容易地看出表的结构来:
class User(object): def _init_(self, id, name): self.id = id self.name = name
[ User('1', 'Michael'), User('2', 'Bob'), User('3', 'Adam') ] 这就是传说中的ORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上。是不是很简单?
但是由谁来做这个转换呢?所以ORM框架应运而生。
在Python中,最有名的ORM框架是SQLAlchemy。 但是基于SQLAlchemy实现的peewee更加清晰和简单,我们决定用这个来实现我们的orm。
7.2 简单应用
我们现在开始做一个demo,实现一个文章的增删改查。在model目录下面放置我们的models.py.
import sys
sys.path.append("..")
from datetime import datetime
from peewee import *
from config.settings import settings
db = MySQLDatabase(
host = settings['mysql_options']['hostaddress'],
database = settings['mysql_options']['database'],
user = settings['mysql_options']['user'],
passwd = settings['mysql_options']['password'],
charset = 'utf8'
)
class BaseModel(Model):
class Meta:
database = db
class Article(BaseModel):
title = CharField(max_length=100)
author = CharField(max_length=50)
description = CharField(max_length=50)
content = TextField()
dateline = DateTimeField(default=datetime.now())
if __name__ == '__main__':
#创建表
Article.create_table()
mysql我们已经在settings中设置过了,在生成对应的表之前,我们需要创建在settings中设置的数据库。 之后运行python models.py数据表就生成了。接着我们在demo中开始使用。 代码不多,下面我们展示这些增删改查:
import tornado.web
import pymongo
import json
from tornado import gen
from base import BaseHandler
from model.models import Article
from peewee import DatabaseError, DoesNotExist
class MainHandler(BaseHandler):
@tornado.web.authenticated
def get(self):
articles = Article.select()
self.render("article/index.html", articles=articles)
class AddHandler(BaseHandler):
@tornado.web.authenticated
def get(self):
self.render("article/add.html")
def post(self):
title = self.get_argument('title')
author = self.get_argument('author')
description = self.get_argument('description')
content = self.get_argument('content')
article = Article.create(title=title, author=author, description=description, content=content)
article.save()
self.redirect('/manage')
class ManageHandler(BaseHandler):
@tornado.web.authenticated
def get(self):
articles = Article.select().order_by(Article.id.desc())
self.render("article/manage.html", articles=articles)
class DeleteHandler(BaseHandler):
@tornado.web.authenticated
def get(self):
id = self.get_argument('id')
article = Article.get(Article.id == id)
article.delete_instance()
self.redirect('/manage')
class ModifyHandler(BaseHandler):
@tornado.web.authenticated
def get(self):
id = self.get_argument('id')
article = Article.get(Article.id == id)
self.render("article/modify.html", article=article)
def post(self):
id = self.get_argument('id')
title = self.get_argument('title')
author = self.get_argument('author')
description = self.get_argument('description')
content = self.get_argument('content')
article = Article.get(Article.id == id)
article.title = title
article.author = author
article.description = description
article.content = content
article.save()
self.redirect('/manage')
class SearchHandler(BaseHandler):
@tornado.web.authenticated
def get(self):
key = self.get_argument('key')
articles = Article.select().where(Article.title.contains(key))
self.render("article/index.html", articles=articles)
这些例子都很简单,peewee的操作是非常简单灵活的,在线手册: http://peewee.readthedocs.org/en/latest/
前端部分就不展示了,直接看我的源码很简单: 需要说明一下的是,我们之前的提交都是ajax,如果是普通的form提交的话,那么 {% raw xsrf_form_html() %}要放置在form中。