tornado八:数据库
tornado没有自带的ORM,对于数据库需要自己去适配。目前python3.6+tornado,还没有比较完善的驱动。
一、创建数据库操作类
import pymysql # class MySQL(): class MyCustomSQL(object): def __init__(self, host, user, passwd, dbName): self.host = host self.user = user self.passwd = passwd self.dbName = dbName def connect(self): self.db = pymysql.connect(self.host, self.user, self.passwd, self.dbName) self.cursor = self.db.cursor() def close(self): self.cursor.close() self.db.close() def get_one(self, sql): res = None try: self.connect() self.cursor.execute(sql) res = self.cursor.fetchone() self.close() except: print "faile to select" return res def get_all(self, sql): res = None try: self.connect() self.cursor.execute(sql) res = self.cursor.fetchall() self.close() except: print "faile to select" return res def get_all_obj(self, sql, tableName, *args): resList = [] fieldList = [] if len(args) > 0: for item in args: fieldList.append(item) else: fieldSql = "select COLUMN_NAME from information_schema.COLUMNS where tabl_name=%s and table_schema=%s" % ( tableName, self.dbName ) fields = self.get_all(fieldSql) for item in fields: fieldList.append(item[0]) # select res = self.get_all(sql) for item in res: obj = {} count = 0 for x in item: obj[fieldList[count]] = x count += 1 resList.append(obj) return resList def insert(self, sql): return self.__edit(sql) def update(self, sql): return self.__edit(sql) def delete(self, sql): return self.__edit(sql) def __edit(self, sql): count = 0 try: self.connect() count = self.cursor.execute(sql) self.db.commit() self.close() except: print " faile execute sql" self.db.rollback() return count
二、链接数据库:
在应用app启动的时侯,创建一个数据库连接实例,供各个RequestHandler使用。
在RequestHandler中通过self.application.db操作数据库。
1.在config配置中,添加数据库配置
# 数据库配置 mysql = { "host": "127.0.0.1", "user": "root", "passwd": "123456", "dbName": "test" }
2.在application路由中,建立数据库连接。使用前面数据操作类,实例化此数据操作类。
#application.py self.db = MyCustomSQL(config.mysql["host"], config.mysql["user"], config.mysql["passwd"], config.mysql["dbName"])
三、业务--数据库操作
3.创建查询某业务的路由
4.创建此业务的模板文件
#路由 # 数据库 (r'/stu', index.StuHandler),
#stu.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <ul> {% for stu in stus %} <li>{{ stu["name"]---stu["age"]</li> {% end %} </ul> </body> </html>
5.创建此业务的视图处理函数Handler
class StuHandler(RequestHandler): def get(self, *args, **kwargs): sql = "select * from students" # stus = self.application.db.get_all_obj( # sql, "students" # ) sql = "select name,age from students" stus = self.application.db.get_all_obj( sql, "students", "name", "age" ) print stus self.render('stu.html', stus=stus)
四、封装ORM
怎么实现save, filter等数据库操作?
在以上数据库操作类的外层,再包装一层映射即可。
1.创建orm目录结构:
创建models.py,用于存放创建数据库与python类的关系类。
创建ORM包,用于存放外层映射包装的类。
2.实现外层封装
import tornado.web from mycustomsql import MyCustomSQL class ORM(tornado.web.RequestHandler): # 为了让ORM使用到application实例中的selb.db实例,继承自tornado.web.RequestHandler;就可以使用self.application.db操作数据库 def save1(self): # insert into students (name, age) values ("jerry", 23) sql = "" # todo,实现sql取得上行的sql语句,且通用,完成ORM最后一步。 self.application.db.insert(sql) def delete(self): pass def update(self): pass def all(self): pass def filter(self): pass def save(self): # insert into students (name, age) values ("jerry", 23) tableName = (self.__class__.__name__).lower() fieldsStr = valuesStr = "(" for field in self.__dict__: fieldsStr += (field + ",") if isinstance(self.__dict__[field], str): valuesStr += ("'" + self.__dict__[field] + "',") else: valuesStr += (str(self.__dict__[field]) + ",") fieldsStr = fieldsStr[:len(fieldsStr) -1] + ")" valuesStr = valuesStr[:len(valuesStr) -1] + ")" sql = "insert into " + tableName + " " + fieldsStr + " values " + valuesStr db = MyCustomSQL() db.insert(sql)
3.在models.py中,创建数据库与python类的关系类
from ORM.orm import ORM class Stu(ORM): def __init__(self, name, age): self.name = name self.age = age
4.在业务处理视图Handler中,使用3.的python类操作数据库。
class StuHandler(RequestHandler): def get(self, *args, **kwargs): from models import Stu stu = Stu("jerry", 23) stu.save() self.render('ok')
5.从application中去掉self.db
不再需要从applciation中调用self.db
posted on 2018-07-29 21:20 myworldworld 阅读(506) 评论(0) 收藏 举报
浙公网安备 33010602011771号