1. Day 4 - 编写Model
    2. 阅读: 71713
    3. 有了ORM,我们就可以把Web App需要的3个表用Model表示出来:
    4. import time, uuid
    5. from orm import Model, StringField, BooleanField, FloatField, TextField
    6. def next_id():
    7. return '%015d%s000' % (int(time.time() * 1000), uuid.uuid4().hex)
    8. class User(Model):
    9. __table__ = 'users'
    10. id = StringField(primary_key=True, default=next_id, ddl='varchar(50)')
    11. email = StringField(ddl='varchar(50)')
    12. passwd = StringField(ddl='varchar(50)')
    13. admin = BooleanField()
    14. name = StringField(ddl='varchar(50)')
    15. image = StringField(ddl='varchar(500)')
    16. created_at = FloatField(default=time.time)
    17. class Blog(Model):
    18. __table__ = 'blogs'
    19. id = StringField(primary_key=True, default=next_id, ddl='varchar(50)')
    20. user_id = StringField(ddl='varchar(50)')
    21. user_name = StringField(ddl='varchar(50)')
    22. user_image = StringField(ddl='varchar(500)')
    23. name = StringField(ddl='varchar(50)')
    24. summary = StringField(ddl='varchar(200)')
    25. content = TextField()
    26. created_at = FloatField(default=time.time)
    27. class Comment(Model):
    28. __table__ = 'comments'
    29. id = StringField(primary_key=True, default=next_id, ddl='varchar(50)')
    30. blog_id = StringField(ddl='varchar(50)')
    31. user_id = StringField(ddl='varchar(50)')
    32. user_name = StringField(ddl='varchar(50)')
    33. user_image = StringField(ddl='varchar(500)')
    34. content = TextField()
    35. created_at = FloatField(default=time.time)
    36. 在编写ORM时,给一个Field增加一个default参数可以让ORM自己填入缺省值,非常方便。并且,缺省值可以作为函数对象传入,在调用save()时自动计算。
    37. 例如,主键id的缺省值是函数next_id,创建时间created_at的缺省值是函数time.time,可以自动设置当前日期和时间。
    38. 日期和时间用float类型存储在数据库中,而不是datetime类型,这么做的好处是不必关心数据库的时区以及时区转换问题,排序非常简单,显示的时候,只需要做一个floatstr的转换,也非常容易。
    39. 初始化数据库表
    40. 如果表的数量很少,可以手写创建表的SQL脚本:
    41. -- schema.sql
    42. drop database if exists awesome;
    43. create database awesome;
    44. use awesome;
    45. grant select, insert, update, delete on awesome.* to 'www-data'@'localhost' identified by 'www-data';
    46. create table users (
    47. `id` varchar(50) not null,
    48. `email` varchar(50) not null,
    49. `passwd` varchar(50) not null,
    50. `admin` bool not null,
    51. `name` varchar(50) not null,
    52. `image` varchar(500) not null,
    53. `created_at` real not null,
    54. unique key `idx_email` (`email`),
    55. key `idx_created_at` (`created_at`),
    56. primary key (`id`)
    57. ) engine=innodb default charset=utf8;
    58. create table blogs (
    59. `id` varchar(50) not null,
    60. `user_id` varchar(50) not null,
    61. `user_name` varchar(50) not null,
    62. `user_image` varchar(500) not null,
    63. `name` varchar(50) not null,
    64. `summary` varchar(200) not null,
    65. `content` mediumtext not null,
    66. `created_at` real not null,
    67. key `idx_created_at` (`created_at`),
    68. primary key (`id`)
    69. ) engine=innodb default charset=utf8;
    70. create table comments (
    71. `id` varchar(50) not null,
    72. `blog_id` varchar(50) not null,
    73. `user_id` varchar(50) not null,
    74. `user_name` varchar(50) not null,
    75. `user_image` varchar(500) not null,
    76. `content` mediumtext not null,
    77. `created_at` real not null,
    78. key `idx_created_at` (`created_at`),
    79. primary key (`id`)
    80. ) engine=innodb default charset=utf8;
    81. 如果表的数量很多,可以从Model对象直接通过脚本自动生成SQL脚本,使用更简单。
    82. SQL脚本放到MySQL命令行里执行:
    83. $ mysql -u root -p < schema.sql
    84. 我们就完成了数据库表的初始化。
    85. 编写数据访问代码
    86. 接下来,就可以真正开始编写代码操作对象了。比如,对于User对象,我们就可以做如下操作:
    87. import orm
    88. from models import User, Blog, Comment
    89. def test():
    90. yield from orm.create_pool(user='www-data', password='www-data', database='awesome')
    91. u = User(name='Test', email='test@example.com', passwd='1234567890', image='about:blank')
    92. yield from u.save()
    93. for x in test():
    94. pass
    95. 可以在MySQL客户端命令行查询,看看数据是不是正常存储到MySQL里面了。
    96. 参考源码
    97. day-04