编写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之永远强大的函数
Sep 14 Python
Python显示进度条的方法
Sep 20 Python
Python中尝试多线程编程的一个简明例子
Apr 07 Python
python Django批量导入不重复数据
Mar 25 Python
Python 实现链表实例代码
Apr 07 Python
python2 与python3的print区别小结
Jan 16 Python
Django实现全文检索的方法(支持中文)
May 14 Python
Python实现简单的文本相似度分析操作详解
Jun 16 Python
python模块hashlib(加密服务)知识点讲解
Nov 25 Python
django 数据库 get_or_create函数返回值是tuple的问题
May 15 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
Jan 05 Python
浅谈Selenium+Webdriver 常用的元素定位方式
Jan 13 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
PHP 常用时间函数资料整理
2016/10/22 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
Yii框架小部件(Widgets)用法实例详解
2020/05/15 PHP
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
jquery js 重置表单 reset()具体实现代码
2013/08/05 Javascript
js实现的四级左侧网站分类菜单实例
2015/05/06 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
2015/09/26 Javascript
JS动态日期时间的获取方法
2015/09/28 Javascript
JavaScript实现垂直滚动条效果
2017/01/18 Javascript
angular内置provider之$compileProvider详解
2017/09/27 Javascript
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
vue组件与复用详解
2018/04/08 Javascript
vue操作动画的记录animate.css实例代码
2019/04/26 Javascript
js中值引用和地址引用实例分析
2019/06/21 Javascript
javascript中call,apply,callee,caller用法实例分析
2019/07/24 Javascript
layui实现数据表格隐藏列的示例
2019/10/25 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
[52:14]VG vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python文件比较示例分享
2014/01/10 Python
Python中input和raw_input的一点区别
2014/10/21 Python
Python中pip安装非PyPI官网第三方库的方法
2015/06/02 Python
Python实现将16进制字符串转化为ascii字符的方法分析
2017/07/21 Python
python实现FTP循环上传文件
2020/03/20 Python
Python OrderedDict字典排序方法详解
2020/05/21 Python
html5的canvas方法使用指南
2014/12/15 HTML / CSS
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
美国高端牛仔品牌:Silver Jeans
2019/12/12 全球购物
大班上学期幼儿评语
2014/04/30 职场文书
三年级班级文化建设方案
2014/05/04 职场文书
关于运动会的宣传稿
2015/07/23 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书
微信小程序和php的登录实现
2021/04/01 PHP
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python
Python IO文件管理的具体使用
2022/03/20 Python
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python