编写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 03 Python
python生成式的send()方法(详解)
May 08 Python
Python中join函数简单代码示例
Jan 09 Python
Django添加KindEditor富文本编辑器的使用
Oct 24 Python
python 进程 进程池 进程间通信实现解析
Aug 23 Python
python实现一个函数版的名片管理系统过程解析
Aug 27 Python
OpenCV模板匹配matchTemplate的实现
Oct 18 Python
python-numpy-指数分布实例详解
Dec 07 Python
使用Python操作ArangoDB的方法步骤
Feb 02 Python
Python高阶函数与装饰器函数的深入讲解
Nov 10 Python
python3 kubernetes api的使用示例
Jan 12 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
May 17 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 has encountered an Access Violation
2007/01/15 PHP
PHP投票系统防刷票判断流程分析
2012/02/04 PHP
解析php如何将日志写进syslog
2013/06/28 PHP
PHP英文字母大小写转换函数小结
2014/05/03 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
2018/10/12 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
2020/04/26 PHP
优化Jquery,提升网页加载速度
2013/11/14 Javascript
jQuery移除元素自动解绑事件实现思路及代码
2014/05/31 Javascript
nodejs下打包模块archiver详解
2014/12/03 NodeJs
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
详解javascript函数的参数
2015/11/10 Javascript
详解JavaScript逻辑And运算符
2015/12/04 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
Bootstrapvalidator校验、校验清除重置的实现代码(推荐)
2016/09/28 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
vue高德地图之玩转周边
2017/06/16 Javascript
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
利用Javascript开发一个二维周视图日历
2017/12/14 Javascript
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
vue项目中极验验证的使用代码示例
2019/12/03 Javascript
vue下axios拦截器token刷新机制的实例代码
2020/01/17 Javascript
详细分析vue响应式原理
2020/06/22 Javascript
vue3.0自定义指令(drectives)知识点总结
2020/12/27 Vue.js
python中matplotlib实现最小二乘法拟合的过程详解
2017/07/11 Python
python机器学习库常用汇总
2017/11/15 Python
Java实现的执行python脚本工具类示例【使用jython.jar】
2018/03/29 Python
Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度
2018/04/09 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
使用python实现男神女神颜值打分系统(推荐)
2019/10/31 Python
HTML5标签使用方法详解
2015/11/27 HTML / CSS
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
金智子午JAVA面试题
2015/09/04 面试题
拔河比赛口号
2014/06/10 职场文书
PostgreSQL之连接失败的问题及解决
2023/05/08 PostgreSQL