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中。