编写Python的web框架中的Model的教程


Posted in Python onApril 29, 2015

有了ORM,我们就可以把Web App需要的3个表用Model表示出来:

import time, uuid

from transwarp.db import next_id
from transwarp.orm import Model, StringField, BooleanField, FloatField, TextField

class User(Model):
  __table__ = 'users'

  id = StringField(primary_key=True, default=next_id, ddl='varchar(50)')
  email = StringField(updatable=False, ddl='varchar(50)')
  password = StringField(ddl='varchar(50)')
  admin = BooleanField()
  name = StringField(ddl='varchar(50)')
  image = StringField(ddl='varchar(500)')
  created_at = FloatField(updatable=False, default=time.time)

class Blog(Model):
  __table__ = 'blogs'

  id = StringField(primary_key=True, default=next_id, ddl='varchar(50)')
  user_id = StringField(updatable=False, ddl='varchar(50)')
  user_name = StringField(ddl='varchar(50)')
  user_image = StringField(ddl='varchar(500)')
  name = StringField(ddl='varchar(50)')
  summary = StringField(ddl='varchar(200)')
  content = TextField()
  created_at = FloatField(updatable=False, default=time.time)

class Comment(Model):
  __table__ = 'comments'

  id = StringField(primary_key=True, default=next_id, ddl='varchar(50)')
  blog_id = StringField(updatable=False, ddl='varchar(50)')
  user_id = StringField(updatable=False, ddl='varchar(50)')
  user_name = StringField(ddl='varchar(50)')
  user_image = StringField(ddl='varchar(500)')
  content = TextField()
  created_at = FloatField(updatable=False, default=time.time)

在编写ORM时,给一个Field增加一个default参数可以让ORM自己填入缺省值,非常方便。并且,缺省值可以作为函数对象传入,在调用insert()时自动计算。

例如,主键id的缺省值是函数next_id,创建时间created_at的缺省值是函数time.time,可以自动设置当前日期和时间。

日期和时间用float类型存储在数据库中,而不是datetime类型,这么做的好处是不必关心数据库的时区以及时区转换问题,排序非常简单,显示的时候,只需要做一个float到str的转换,也非常容易。
初始化数据库表

如果表的数量很少,可以手写创建表的SQL脚本:

-- schema.sql

drop database if exists awesome;

create database awesome;

use awesome;

grant select, insert, update, delete on awesome.* to 'www-data'@'localhost' identified by 'www-data';

create table users (
  `id` varchar(50) not null,
  `email` varchar(50) not null,
  `password` varchar(50) not null,
  `admin` bool not null,
  `name` varchar(50) not null,
  `image` varchar(500) not null,
  `created_at` real not null,
  unique key `idx_email` (`email`),
  key `idx_created_at` (`created_at`),
  primary key (`id`)
) engine=innodb default charset=utf8;

create table blogs (
  `id` varchar(50) not null,
  `user_id` varchar(50) not null,
  `user_name` varchar(50) not null,
  `user_image` varchar(500) not null,
  `name` varchar(50) not null,
  `summary` varchar(200) not null,
  `content` mediumtext not null,
  `created_at` real not null,
  key `idx_created_at` (`created_at`),
  primary key (`id`)
) engine=innodb default charset=utf8;

create table comments (
  `id` varchar(50) not null,
  `blog_id` varchar(50) not null,
  `user_id` varchar(50) not null,
  `user_name` varchar(50) not null,
  `user_image` varchar(500) not null,
  `content` mediumtext not null,
  `created_at` real not null,
  key `idx_created_at` (`created_at`),
  primary key (`id`)
) engine=innodb default charset=utf8;

如果表的数量很多,可以从Model对象直接通过脚本自动生成SQL脚本,使用更简单。

把SQL脚本放到MySQL命令行里执行:

$ mysql -u root -p < schema.sql

我们就完成了数据库表的初始化。
编写数据访问代码

接下来,就可以真正开始编写代码操作对象了。比如,对于User对象,我们就可以做如下操作:

# test_db.py

from models import User, Blog, Comment

from transwarp import db

db.create_engine(user='www-data', password='www-data', database='awesome')

u = User(name='Test', email='test@example.com', password='1234567890', image='about:blank')

u.insert()

print 'new user id:', u.id

u1 = User.find_first('where email=?', 'test@example.com')
print 'find user\'s name:', u1.name

u1.delete()

u2 = User.find_first('where email=?', 'test@example.com')
print 'find user:', u2

可以在MySQL客户端命令行查询,看看数据是不是正常存储到MySQL里面了。

Python 相关文章推荐
Python笔记(叁)继续学习
Oct 24 Python
爬山算法简介和Python实现实例
Apr 26 Python
Python开发常用的一些开源Package分享
Feb 14 Python
Python中二维列表如何获取子区域元素的组成
Jan 19 Python
Python实现矩阵转置的方法分析
Nov 24 Python
Python实现修改IE注册表功能示例
May 10 Python
pycharm远程linux开发和调试代码的方法
Jul 17 Python
Sanic框架应用部署方法详解
Jul 18 Python
windows下numpy下载与安装图文教程
Apr 02 Python
Python将json文件写入ES数据库的方法
Apr 10 Python
MNIST数据集转化为二维图片的实现示例
Jan 10 Python
Python 避免字典和元组的多重嵌套问题
Jul 15 Python
python获取本地计算机名字的方法
Apr 29 #Python
Python中编写ORM框架的入门指引
Apr 29 #Python
python获取本机mac地址和ip地址的方法
Apr 29 #Python
在Python中编写数据库模块的教程
Apr 29 #Python
Python的gevent框架的入门教程
Apr 29 #Python
在Python中使用HTML模版的教程
Apr 29 #Python
以Flask为例讲解Python的框架的使用方法
Apr 29 #Python
You might like
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
ThinkPHP模板中数组循环实例
2014/10/30 PHP
php中最简单的字符串匹配算法
2014/12/16 PHP
PHP文件缓存类实现代码
2015/10/26 PHP
PHP实现下载远程图片保存到本地的方法
2017/06/19 PHP
PHPMAILER实现PHP发邮件功能
2018/04/18 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
JAVASCRIPT keycode总结
2009/02/04 Javascript
event.currentTarget与event.target的区别介绍
2012/12/31 Javascript
当达到输入长度时表单自动切换焦点
2014/04/06 Javascript
jquery判断复选框是否选中进行答题提示特效
2015/12/10 Javascript
js 提交form表单和设置form表单请求路径的实现方法
2016/10/25 Javascript
Node.js 使用命令行工具检查更新
2017/06/08 Javascript
JavaScript图片处理与合成总结
2018/03/04 Javascript
JS实现快递单打印功能【推荐】
2018/06/21 Javascript
JSON.stringify()方法讲解
2019/01/31 Javascript
解析vue、angular深度作用选择器
2019/09/11 Javascript
Python中使用第三方库xlrd来读取Excel示例
2015/04/05 Python
Python爬虫爬验证码实现功能详解
2016/04/14 Python
Python调用ctypes使用C函数printf的方法
2017/08/23 Python
Python列表删除的三种方法代码分享
2017/10/31 Python
Python中使用遍历在列表中添加字典遇到的坑
2019/02/27 Python
jupyter notebook读取/导出文件/图片实例
2020/04/16 Python
Python3基于print打印带颜色字符串
2020/07/06 Python
国外平面设计第一市场:99designs
2016/10/25 全球购物
婴儿地球:Baby Earth
2018/12/25 全球购物
Linux机考试题
2015/10/16 面试题
岗位职责定义及内容
2013/11/08 职场文书
复核员上岗演讲稿
2014/01/05 职场文书
《将心比心》教学反思
2014/04/08 职场文书
团日活动总结报告
2014/06/25 职场文书
社区清明节活动总结
2014/07/04 职场文书
征用土地赔偿协议书
2014/09/26 职场文书
房地产销售经理岗位职责
2015/02/02 职场文书
校长师德表现自我评价
2015/03/04 职场文书
文明礼仪倡议书
2015/04/28 职场文书