编写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 splitlines使用技巧
Sep 06 Python
Django的URLconf中使用缺省视图参数的方法
Jul 18 Python
python实现rsa加密实例详解
Jul 19 Python
利用Python查看目录中的文件示例详解
Aug 28 Python
Python获取当前公网ip并自动断开宽带连接实例代码
Jan 12 Python
对Pytorch神经网络初始化kaiming分布详解
Aug 18 Python
Python3实现配置文件差异对比脚本
Nov 18 Python
Keras使用tensorboard显示训练过程的实例
Feb 15 Python
K最近邻算法(KNN)---sklearn+python实现方式
Feb 24 Python
Python本地及虚拟解释器配置过程解析
Oct 13 Python
在python中对于bool布尔值的取反操作
Dec 11 Python
Python中非常使用的6种基本变量的操作与技巧
Mar 22 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
一台收音机,让一家人都笑逐颜开!
2020/08/21 无线电
改进的IP计数器
2006/10/09 PHP
php使用递归计算文件夹大小
2014/12/24 PHP
PHP实现检测客户端是否使用代理服务器及其匿名级别
2015/01/07 PHP
PHP导入导出Excel代码
2015/07/07 PHP
编写PHP脚本使WordPress的主题支持Widget侧边栏
2015/12/14 PHP
让Laravel API永远返回JSON格式响应的方法示例
2018/09/05 PHP
PHP基于cookie实现统计在线人数功能示例
2019/01/16 PHP
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
2012/10/11 Javascript
分享Javascript中最常用的55个经典小技巧
2013/11/29 Javascript
JQuery与Ajax调用新浪API获取短网址的代码
2014/02/07 Javascript
jquery实现的网页自动播放声音
2014/04/30 Javascript
JS输入用户名自动显示邮箱后缀列表的方法
2015/01/27 Javascript
js对字符的验证方法汇总
2015/02/04 Javascript
jquery实现TAB选项卡鼠标经过带延迟效果的方法
2015/07/27 Javascript
js实现跨域的几种方法汇总(图片ping、JSONP和CORS)
2015/10/25 Javascript
jQuery实现的瀑布流加载效果示例
2016/09/13 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
2017/05/28 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
javascript和php使用ajax通信传递JSON的实例
2018/08/21 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
vue组件开发之用户无限添加自定义填写表单的方法
2018/08/28 Javascript
Vue 样式绑定的实现方法
2019/01/15 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
layui表格数据重载
2019/07/27 Javascript
JavaScript判断数组类型的方法
2019/10/23 Javascript
python实现代理服务功能实例
2013/11/15 Python
python中的reduce内建函数使用方法指南
2014/08/31 Python
Django日志模块logging的配置详解
2017/02/14 Python
tensorflow输出权重值和偏差的方法
2018/02/10 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
2018/05/24 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
Mysql数据库反向生成Django里面的models指令方式
2020/05/18 Python
Python 解析xml文件的示例
2020/09/29 Python
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
上班离岗检讨书
2014/01/27 职场文书