视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
编写Python的web框架中的Model的教程
2020-11-27 14:41:51 责编:小采
文档


有了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='12345670', 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里面了。

下载本文
显示全文
专题