编写Python的web框架中的Model的教程
有了ORM,我们就可以把WebApp需要的3个表用Model表示出来:
importtime,uuid fromtranswarp.dbimportnext_id fromtranswarp.ormimportModel,StringField,BooleanField,FloatField,TextField classUser(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) classBlog(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) classComment(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 dropdatabaseifexistsawesome; createdatabaseawesome; useawesome; grantselect,insert,update,deleteonawesome.*to'www-data'@'localhost'identifiedby'www-data'; createtableusers( `id`varchar(50)notnull, `email`varchar(50)notnull, `password`varchar(50)notnull, `admin`boolnotnull, `name`varchar(50)notnull, `image`varchar(500)notnull, `created_at`realnotnull, uniquekey`idx_email`(`email`), key`idx_created_at`(`created_at`), primarykey(`id`) )engine=innodbdefaultcharset=utf8; createtableblogs( `id`varchar(50)notnull, `user_id`varchar(50)notnull, `user_name`varchar(50)notnull, `user_image`varchar(500)notnull, `name`varchar(50)notnull, `summary`varchar(200)notnull, `content`mediumtextnotnull, `created_at`realnotnull, key`idx_created_at`(`created_at`), primarykey(`id`) )engine=innodbdefaultcharset=utf8; createtablecomments( `id`varchar(50)notnull, `blog_id`varchar(50)notnull, `user_id`varchar(50)notnull, `user_name`varchar(50)notnull, `user_image`varchar(500)notnull, `content`mediumtextnotnull, `created_at`realnotnull, key`idx_created_at`(`created_at`), primarykey(`id`) )engine=innodbdefaultcharset=utf8;
如果表的数量很多,可以从Model对象直接通过脚本自动生成SQL脚本,使用更简单。
把SQL脚本放到MySQL命令行里执行:
$mysql-uroot-p<schema.sql
我们就完成了数据库表的初始化。
编写数据访问代码
接下来,就可以真正开始编写代码操作对象了。比如,对于User对象,我们就可以做如下操作:
#test_db.py frommodelsimportUser,Blog,Comment fromtranswarpimportdb 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'newuserid:',u.id u1=User.find_first('whereemail=?','test@example.com') print'finduser\'sname:',u1.name u1.delete() u2=User.find_first('whereemail=?','test@example.com') print'finduser:',u2
可以在MySQL客户端命令行查询,看看数据是不是正常存储到MySQL里面了。