Python学习笔记:Day4 编写Model

匿名 (未验证) 提交于 2019-12-02 22:54:36

最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖子,廖雪峰的课程连接在这里:廖雪峰
Python的相关介绍,以及它的历史故事和运行机制,可以参见这篇:python介绍
Python的安装可以参见这篇:Python安装
Python的运行模式以及输入输出可以参见这篇:Python IO
Python的基础概念介绍,可以参见这篇:Python 基础
Python字符串和编码的介绍,可以参见这篇:Python字符串与编码
Python基本数据结构:list和tuple介绍,可以参见这篇:Python list和tuple
Python控制语句介绍:ifelse,可以参见这篇:Python 条件判断
Python控制语句介绍:循环实现,可以参见这篇:Python循环语句
Python数据结构:dict和set介绍Python数据结构dict和set
Python函数相关:Python函数
Python高阶特性:Python高级特性
Python高阶函数:Python高阶函数
Python匿名函数:Python匿名函数
Python装饰器:Python装饰器
Python偏函数:Python偏函数
Python模块:Python模块
Python面向对象编程(1):Python面向对象
Python面向对象编程(2):Python面向对象(2)
Python面向对象编程(3):Python面向对象(3)
Python面向对象编程(4):Pyhton面向对象(4)
Python面向对象高级编程(上):Python面向对象高级编程(上)
Python面向对象高级编程(中上):Python面向对象高级编程(中上)
Python面向对象高级编程(中下):Python面向对象高级编程(中下)
Python面向对象高级编程(完):Python面向对象高级编程(完)
Python错误调试(起):Python调试:起
Python错误调试(承):Python调试:承
Python错误调试(转):Python调试:转
Python错误调试(合):python调试:合
Python文件IO编程:Python文件IO
Python文件IO编程2:Python文件IO2
Python文件IO编程3:PYthon文件IO3
Python进程和线程(起):Python进程和线程起
Python进程和线程(承):Python进程和线程承
Python进程和线程(转):Python进程和线程转
Python进程和线程(合):Python进程和线程合
Python正则表达式:Python正则表达式
Python学习笔记:常用内建模块1:Python学习笔记:常用内建模块1
Python学习笔记:常用内建模块2:Python学习笔记:常用内建模块2
Python学习笔记:常用内建模块3:Python学习笔记:常用内建模块3
Python学习笔记:常用内建模块4:Python学习笔记: 常用内建模块4
Python学习笔记:常用内建模块5:Python学习笔记: 常用内建模块5
Python学习笔记:常用内建模块6:Python学习笔记:常用内建模块6
Python学习笔记:第三方模块1:Python常用第三方模块
Python学习笔记:第三方模块2:Python常用第三方模块
Python学习笔记:第三方模块3:Python常用第三方模块
Pytho学习笔记:网络编程:Python网络编程
Python学习笔记:电子邮件:Python电子邮件1
Python学习笔记:SMTP服务器:PythonSMTP服务器
Python学习笔记:POP3服务器:PythonPOP3服务器
Python学习笔记:Python数据库 Python数据库1
Python学习笔记:Python数据库2Python数据库2
Python学习笔记:web开发1Python学习笔记:web开发1
Python学习笔记:web开发2Python学习笔记: web开发2
Python学习笔记: web开发3Python学习笔记: web开发3
Python学习笔记:异步IO(1)Python学习笔记:异步IO(1)
Python学习笔记:异步IO(2)Python学习笔记:异步IO(2)
Python学习笔记:异步IO(3)Python学习笔记:异步IO(3)
Python学习笔记:Day 1-2开发Python学习笔记:Day1-2开发
Python学习笔记:Day 3 ORMPython学习笔记:Day3 ORM

Ŀ¼

有了ORM,我们就可以把Web App需要的3个表用Model表示出来:

import time, uuid  from orm import Model, StringField, BooleanField, FloatField, TextField  def next_id():     return '%015d%s000' % (int(time.time() * 1000), uuid.uuid4().hex)  class User(Model):     __table__ = 'users'      id = StringField(primary_key=True, default=next_id, ddl='varchar(50)')     email = StringField(ddl='varchar(50)')     passwd = StringField(ddl='varchar(50)')     admin = BooleanField()     name = StringField(ddl='varchar(50)')     image = StringField(ddl='varchar(500)')     created_at = FloatField(default=time.time)  class Blog(Model):     __table__ = 'blogs'      id = StringField(primary_key=True, default=next_id, ddl='varchar(50)')     user_id = StringField(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(default=time.time)  class Comment(Model):     __table__ = 'comments'      id = StringField(primary_key=True, default=next_id, ddl='varchar(50)')     blog_id = StringField(ddl='varchar(50)')     user_id = StringField(ddl='varchar(50)')     user_name = StringField(ddl='varchar(50)')     user_image = StringField(ddl='varchar(500)')     content = TextField()     created_at = FloatField(default=time.time)

在编写ORM时,给一个Field增加一个default参数可以让ORM自己填入缺省值,非常方便。并且,缺省值可以作为函数对象传入,在调用save()时自动计算。

例如,主键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,     `passwd` 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对象,我们就可以做如下操作:

import orm from models import User, Blog, Comment  def test():     yield from orm.create_pool(user='www-data', password='www-data', database='awesome')      u = User(name='Test', email='test@example.com', passwd='1234567890', image='about:blank')      yield from u.save()  for x in test():     pass

可以在MySQL客户端命令行查询,看看数据是不是正常存储到MySQL里面了。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!