编写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 相关文章推荐
pip 错误unused-command-line-argument-hard-error-in-future解决办法
Jun 01 Python
python写的一个squid访问日志分析的小程序
Sep 17 Python
Python书单 不将就
Jul 11 Python
Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
Mar 23 Python
解决python中使用plot画图,图不显示的问题
Jul 04 Python
Django中使用极验Geetest滑动验证码过程解析
Jul 31 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
Aug 06 Python
Python绘制股票移动均线的实例
Aug 24 Python
python通过文本在一个图中画多条线的实例
Feb 21 Python
keras自动编码器实现系列之卷积自动编码器操作
Jul 03 Python
在PyCharm中安装PaddlePaddle的方法
Feb 05 Python
Python OpenGL基本配置方式
May 20 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 引用文件技巧
2010/03/02 PHP
深入PHP FTP类的详解
2013/06/13 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
2017/07/10 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
2020/04/06 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
2020/04/22 PHP
jQuery解决iframe高度自适应代码
2009/12/20 Javascript
jQuery+.net实现浏览更多内容(改编php版本)
2013/03/28 Javascript
js 触发select onchange事件代码
2014/03/20 Javascript
javascript实现playfair和hill密码算法
2014/12/07 Javascript
JavaScript插件化开发教程 (三)
2015/01/27 Javascript
js+html5操作sqlite数据库的方法
2016/02/02 Javascript
原生JS和jQuery版实现文件上传功能
2016/04/18 Javascript
js实现获取两个日期之间所有日期的方法
2016/06/17 Javascript
javascript运算符语法全面概述
2016/07/14 Javascript
JS实现的手机端精简幻灯片效果
2016/09/05 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
nvm、nrm、npm 安装和使用详解(小结)
2019/01/17 Javascript
在arcgis使用python脚本进行字段计算时是如何解决中文问题的
2015/10/18 Python
Python中在脚本中引用其他文件函数的实现方法
2016/06/23 Python
python实现逻辑回归的方法示例
2017/05/02 Python
python学习教程之Numpy和Pandas的使用
2017/09/11 Python
Python编程实现tail-n查看日志文件的方法
2019/07/08 Python
python将字符串转换成json的方法小结
2019/07/09 Python
Django框架表单操作实例分析
2019/11/04 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
python3检查字典传入函数键是否齐全的实例
2020/06/05 Python
python 最简单的实现适配器设计模式的示例
2020/06/30 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
2020/12/07 Python
Canvas 文字碰撞检测并抽稀的方法
2019/05/27 HTML / CSS
KELLER SPORTS荷兰:在线订购最好的运动产品
2020/10/13 全球购物
HR喜欢的自荐信格式
2013/10/08 职场文书
个人素质的自我评价分享
2013/12/16 职场文书
写给导师的自荐信
2015/03/06 职场文书
区域销售经理岗位职责
2015/04/02 职场文书
银行客户经理岗位职责
2015/04/09 职场文书
Python机器学习之基础概述
2021/05/19 Python