编写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的面向对象思想分析
Jan 14 Python
Python脚本实现格式化css文件
Apr 08 Python
简单的连接MySQL与Python的Bottle框架的方法
Apr 30 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
Nov 23 Python
Python----数据预处理代码实例
Mar 20 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
vscode 配置 python3开发环境的方法
Sep 19 Python
Python django搭建layui提交表单,表格,图标的实例
Nov 18 Python
Python实现王者荣耀自动刷金币的完整步骤
Jan 22 Python
Python创建自己的加密货币的示例
Mar 01 Python
如何用python绘制雷达图
Apr 24 Python
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
Jun 08 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多个版本的分析解释
2011/07/21 PHP
php常用数学函数汇总
2014/11/21 PHP
CodeIgniter常用知识点小结
2016/05/26 PHP
javascript级联下拉列表实例代码(自写)
2013/05/10 Javascript
JQuery实现动态表格点击按钮表格增加一行
2014/08/24 Javascript
jquery中push()的用法(数组添加元素)
2014/11/25 Javascript
js的toLowerCase方法用法实例
2015/01/27 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
jQuery表单插件ajaxForm实例详解
2017/01/17 Javascript
js获取ip和地区
2017/03/10 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
2019/08/20 Javascript
vue计算属性无法监听到数组内部变化的解决方案
2019/11/06 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
2019/12/01 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
2020/03/17 Javascript
python实现人人网登录示例分享
2014/01/19 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
2017/10/16 Python
解决python 自动安装缺少模块的问题
2018/10/22 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
2019/05/10 Python
python自动化测试之如何解析excel文件
2019/06/27 Python
pandas read_excel()和to_excel()函数解析
2019/09/19 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
python中执行smtplib失败的处理方法
2020/07/01 Python
如何快速一次性卸载所有python包(第三方库)呢
2020/10/20 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
2021/01/29 Python
联想美国官方商城:Lenovo美国
2017/06/19 全球购物
化妆师职业生涯规划书
2014/02/16 职场文书
工程项目建议书范文
2014/03/12 职场文书
员工廉洁自律承诺书
2014/05/26 职场文书
面试感谢信范文
2015/01/22 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
关于React Native使用axios进行网络请求的方法
2021/08/02 Javascript
PostgreSQL出现死锁该如何解决
2022/05/30 PostgreSQL