编写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 判断一个进程是否存在
Apr 09 Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
Jun 30 Python
简单易懂的python环境安装教程
Jul 13 Python
利用python解决mysql视图导入导出依赖的问题
Dec 17 Python
python机器学习之神经网络(三)
Dec 20 Python
python实现跨excel的工作表sheet之间的复制方法
May 03 Python
python最长回文串算法
Jun 04 Python
python3读取csv和xlsx文件的实例
Jun 22 Python
python编程进阶之异常处理用法实例分析
Feb 21 Python
Python爬取微信小程序通用方法代码实例详解
Sep 29 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
Mar 02 Python
利用For循环遍历Python字典的三种方法实例
Mar 25 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
DC《神奇女侠2》因疫情推迟上映 温子仁新恐怖片《恶性》撤档
2020/04/09 欧美动漫
解析php二分法查找数组是否包含某一元素
2013/05/23 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
js中的preventDefault与stopPropagation详解
2014/01/29 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
JavaScript数组迭代器实例分析
2015/06/09 Javascript
JS实现兼容性较好的随屏滚动效果
2015/11/09 Javascript
jquery中键盘事件小结
2016/02/24 Javascript
jQuery 更改checkbox的状态,无效的解决方法
2016/07/22 Javascript
Jquery与Bootstrap实现后台管理页面增删改查功能示例
2017/01/22 Javascript
JS 实现随机验证码功能
2017/02/15 Javascript
canvas时钟效果
2017/02/16 Javascript
js从输入框读取内容,比较两个数字的大小方法
2017/03/13 Javascript
Angular数据绑定机制原理
2018/04/17 Javascript
koa-router路由参数和前端路由的结合详解
2019/05/19 Javascript
在Vue.js中使用TypeScript的方法
2020/03/19 Javascript
[03:55]2016国际邀请赛中国区预选赛首日TOP10精彩集锦
2016/06/27 DOTA
Python入门之三角函数全解【收藏】
2017/11/08 Python
简单了解OpenCV是个什么东西
2017/11/10 Python
Python无损音乐搜索引擎实现代码
2018/02/02 Python
Python数据库小程序源代码
2019/09/15 Python
Pycharm+Python+PyQt5使用详解
2019/09/25 Python
python 插入日期数据到Oracle实例
2020/03/02 Python
Python selenium页面加载慢超时的解决方案
2020/03/18 Python
python 瀑布线指标编写实例
2020/06/03 Python
判断单链表中是否存在环
2012/07/16 面试题
vue路由实现登录拦截
2021/03/24 Vue.js
自我鉴定范文300字
2013/10/01 职场文书
乡镇信息公开实施方案
2014/03/23 职场文书
幼儿园教师演讲稿
2014/05/06 职场文书
企业活动策划方案
2014/06/02 职场文书
材料成型及控制工程专业求职信
2014/06/19 职场文书
优秀毕业生找工作自荐信
2014/06/23 职场文书
天堂的孩子观后感
2015/06/11 职场文书
教师外出学习心得体会
2016/01/18 职场文书
利用Python+OpenCV三步去除水印
2021/05/28 Python