编写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中的生成器和yield详细介绍
Jan 09 Python
利用python写个下载teahour音频的小脚本
May 08 Python
一个Python最简单的接口自动化框架
Jan 02 Python
Python解决八皇后问题示例
Apr 22 Python
Django中使用Celery的教程详解
Aug 24 Python
更改Python的pip install 默认安装依赖路径方法详解
Oct 27 Python
Pycharm保存不能自动同步到远程服务器的解决方法
Jun 27 Python
python3 enum模块的应用实例详解
Aug 12 Python
为什么是 Python -m
Jun 19 Python
快速解释如何使用pandas的inplace参数的使用
Jul 23 Python
PyQt5的相对布局管理的实现
Aug 07 Python
Python基础学习之奇异的GUI对话框
May 27 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
利用static实现表格的颜色隔行显示
2006/10/09 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
2011/11/07 PHP
PHP Global变量定义当前页面的全局变量实现探讨
2013/06/05 PHP
php函数重载的替代方法--伪重载详解
2015/05/08 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
2017/04/09 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
更换select下拉菜单背景样式的实现代码
2011/12/20 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
jquery的trigger和triggerHandler的区别示例介绍
2014/04/20 Javascript
Egret引擎开发指南之视觉编程
2014/09/03 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
JavaScript lodash常见用法系列小结
2016/08/24 Javascript
PhotoSwipe异步动态加载图片方法
2016/08/25 Javascript
使用JQuery选择HTML遍历函数的方法
2016/09/17 Javascript
Canvas 制作动态进度加载水球详解及实例代码
2016/12/09 Javascript
vue实现列表的添加点击
2016/12/29 Javascript
深入对Vue.js $watch方法的理解
2017/03/20 Javascript
vue中mint-ui环境搭建详细介绍
2017/04/06 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
webpack dll打包重复问题优化的解决
2018/10/10 Javascript
Vue组件间数据传递的方式(3种)
2020/07/13 Javascript
python list使用示例 list中找连续的数字
2014/01/27 Python
Python实现监控程序执行时间并将其写入日志的方法
2015/06/30 Python
Tornado协程在python2.7如何返回值(实现方法)
2017/06/22 Python
Python实现excel转sqlite的方法
2017/07/17 Python
python多线程之事件Event的使用详解
2018/04/27 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
pycharm创建一个python包方法图解
2019/04/10 Python
Python利用FFT进行简单滤波的实现
2020/02/26 Python
python实现QQ邮箱发送邮件
2020/03/06 Python
团结演讲稿范文
2014/05/23 职场文书
毕业证委托书范文
2014/09/26 职场文书
精神文明建设汇报材料
2014/12/24 职场文书
导游词之西安骊山
2019/12/20 职场文书