编写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中的25个隐藏特性
Mar 30 Python
详解Python中的各种函数的使用
May 24 Python
Python日志模块logging基本用法分析
Aug 23 Python
python中使用zip函数出现错误的原因
Sep 28 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
Oct 30 Python
Python3爬虫全国地址信息
Jan 05 Python
python爬虫刷访问量 2019 7月
Aug 01 Python
详解pycharm连接不上mysql数据库的解决办法
Jan 10 Python
python3读取csv文件任意行列代码实例
Jan 13 Python
tensorflow实现从.ckpt文件中读取任意变量
May 26 Python
numpy中生成随机数的几种常用函数(小结)
Aug 18 Python
Python3+Django get/post请求实现教程详解
Feb 16 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
3
2006/10/09 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
ioncube_loader_win_5.2.dll的错误解决方法
2015/01/04 PHP
Laravel 5框架学习之路由、控制器和视图简介
2015/04/07 PHP
php操作MongoDB类实例
2015/06/17 PHP
浅谈PHP Cookie处理函数
2016/06/10 PHP
自制PHP框架之设计模式
2017/05/07 PHP
php递归函数怎么用才有效
2018/02/24 PHP
PHP商品秒杀问题解决方案实例详解【mysql与redis】
2019/07/22 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
javascript中html字符串转化为jquery dom对象的方法
2015/08/27 Javascript
JS设置cookie、读取cookie
2016/02/24 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
Nodejs读取文件时相对路径的正确写法(使用fs模块)
2017/04/27 NodeJs
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
JS 实现banner图片轮播效果(鼠标事件)
2017/08/04 Javascript
JS删除数组里的某个元素方法
2018/02/03 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
layer提示框添加多个按钮选择的实例
2019/09/12 Javascript
15分钟学会vue项目改造成SSR(小白教程)
2019/12/17 Javascript
分享JS表单验证源码(带错误提示及密码等级)
2020/01/05 Javascript
[00:50]2014DOTA2国际邀请赛 NEWBEE战队回顾
2014/08/01 DOTA
Python 不同对象比较大小示例探讨
2014/08/21 Python
Python os模块中的isfile()和isdir()函数均返回false问题解决方法
2015/02/04 Python
Python 字典与字符串的互转实例
2017/01/13 Python
python挖矿算力测试程序详解
2019/07/03 Python
Django实现auth模块下的登录注册与注销功能
2019/10/10 Python
浅析Python __name__ 是什么
2020/07/07 Python
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
盛大笔试题
2016/11/05 面试题
销售总监岗位职责
2014/01/04 职场文书
乡镇庆八一活动方案
2014/02/02 职场文书
2016预备党员培训心得体会
2016/01/08 职场文书
如何撰写促销方案?
2019/07/05 职场文书
Python scrapy爬取起点中文网小说榜单
2021/06/13 Python