1. 程式人生 > >python學習——編寫Model

python學習——編寫Model

有了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型別,這麼做的好處是不必關心資料庫的時區以及時區轉換問題,排序非常簡單,顯示的時候,只需要做一個floatstr的轉換,也非常容易。

初始化資料庫表

如果表的數量很少,可以手寫建立表的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='[email protected]', passwd='1234567890', image='about:blank')

    yield from u.save()

for x in test():
    pass

可以在MySQL客戶端命令列查詢,看看資料是不是正常儲存到MySQL裡面了。

相關推薦

python學習——編寫Model

有了ORM,我們就可以把Web App需要的3個表用Model表示出來: import time, uuid from orm import Model, StringField, BooleanField, FloatField, TextField def nex

python學習——編寫web框架

在正式開始Web開發前,我們需要編寫一個Web框架。 aiohttp已經是一個Web框架了,為什麼我們還需要自己封裝一個? 原因是從使用者的角度來說,aiohttp相對比較底層,編寫一個URL的處理函式需要這麼幾步: 第一步,編寫一個用@asyncio.corout

python 編寫Model

好處 寫代碼 schema 並且 表示 targe mode local ref 有了ORM,我們就可以把Web App需要的3個表用Model表示出來: import time, uuid from orm import Model, StringField, B

python學習基礎篇--編寫登陸接口

-- strip() 不存在 rip 三次 輸入 for循環 循環 是否 #!/usr/bin/env python#_*_conding:utf-8_*_#-----------------------------------------------------#編寫登陸

Python學習編寫登陸認證程序

inpu file 存儲 提示 用戶鎖定 通過 允許 odin 判斷 需求: 讓用戶輸入用戶名密碼 認證成功後顯示歡迎信息 輸錯三次後退出程序 可以支持多個用戶登錄 (提示,通過列表存多個賬戶信息) 用戶3次認證失敗後,退出程序,再次啟動程序嘗試登錄時,還是鎖定狀態(提示:

python學習總結(一),第一個python程序的編寫

程序代碼 spa 編碼 結構 編輯 下載地址 utf 修改編碼 general 1. python是一種解釋性,編譯型,互動型的語言,面向對象,動態數據類型的高級程序設計語言。 1.1 交互式:意味著可以在一個提示符直接交互執行你寫的程序。 1.2 解釋型:意味著開發過程中

python學習之網站的編寫(HTML,CSS,JS)(十七)----------示例,構造一個網頁的框架,上部標題,登入,logo,左側選單,右側內容,原始碼

結果: 顏色為了明顯,所以較為難看,可以根據自己的需要進行更改 原始碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title

python學習之網站的編寫(HTML,CSS,JS)(十六)----------示例,構造一個左側管理選單的功能,點選主選單才顯示下面的內容

結果: 程式碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>逆水行舟不進則退</title>

python學習之網站的編寫(HTML,CSS,JS)(十五)----------示例,彈出一個背景為半黑色,前面是白框的彈窗功能(已經編好的框架)

效果圖,程式碼直接可應用,按自己的需要在其中加入想要的內容:  程式碼及講解: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <

python學習之網站的編寫(HTML,CSS,JS)(十四)----------CSS的display行內標籤和塊級標籤的轉換,控制標籤是否顯示

行內標籤:有多大就佔多大,無法設定高度,寬度和邊距。 塊級標籤:佔一行,可以設定高度,寬度和邊距。 塊級標籤轉為行內標籤:display:inline 行內標籤轉為塊級標籤:display:block 還有一個特殊的轉換,既包含塊級標籤的屬性,又具有行內標籤的屬性,自己有多少佔多少,

python學習之網站的編寫(HTML,CSS,JS)(十三)----------CSS字型和對齊方式的設定

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>逆水行舟不進則退</title> </head> <b

python學習之網站的編寫(HTML,CSS,JS)(十二)----------CSS邊框的編寫

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>逆水行舟不進則退</title> </head> <b

python學習之網站的編寫(HTML,CSS,JS)(十一)----------如何利用其它html檔案中的CSS(也就是可以將共同的地方提取出來,放大一個檔案中,利於使用)

首先說一下它的具體用處,我們已經知道,當我們寫一個html檔案的時候,不同的標籤想用相同的版式的時候,我們可以將它提取出來,然後再用一些選擇器進行應用,比如class選擇器。但是,但我們編寫多個html檔案中的時候,多個檔案都想用一些相同的版式該怎麼辦呢? 那麼就引入了這種連線的方式,首先寫一個

python學習之網站的編寫(HTML,CSS,JS)(十)----------CSS中用的最多的class選擇器,批量的為一些標籤設定相同的版式

選擇器有很多種,有id選擇器,div選擇器,層級選擇器,組合選擇器等等,然而,用的最多的就是class選擇器,它的作用是為下面所有符合class規則的標籤設定上相同的版式。 步驟: 1.在頭部編寫<style>標籤,點+class選擇器的名稱(也就是下面需要選擇的class),然

python學習之網站的編寫(HTML,CSS,JS)(九)----------table標籤,表格的實現

 table標籤,裡邊的tr表示行,td表示列。 程式碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>逆水行

python學習之網站的編寫(HTML,CSS,JS)(八)----------label標籤,點選label標籤的文字將編輯的游標移過來

 如果不加label的話,只設置值的話,點選文字是不能將編輯的游標移過來的,必須將id連線上之後,才可以實現,點選文字就可以將編輯的游標移過來。 實現結果: 程式碼: <!DOCTYPE html> <html lang="en"> <hea

python學習之網站的編寫(HTML,CSS,JS)(七)----------以列表條目的方式顯示

話不多說,直接上圖 實現的程式碼及解釋: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>逆水行舟不進則退</t

python學習手冊(第4版) 第二十二章 模組程式碼編寫基礎

1.再次溫習python程式結構: 程式由模組組成,模組中包含語句,語句中包含表示式,表示式建立並處理物件。 2.多次匯入模組時,實際執行中,模組只被匯入一次。同時,模組內的語句在第一次被匯入時執行,包括對類和函式的載入,但函式只有在被呼叫時執行。 3.關於fr

python學習之網站的編寫(HTML,CSS,JS)(一)---------------------------------------初識(初學者需瞭解)

首先推薦一款很好的python編譯軟體pycharm,但凡接觸過python的人對它一定不是很陌生,在這裡我們就可以編輯一些瀏覽器認識的html檔案,創造出我們喜歡的網站頁面,在pycharm中建立一個html檔案是下面這樣的,然後我們會對其一句一句的解釋。 <!DO

python學習之網站的編寫(HTML,CSS,JS)(三)----------input系列的標籤詳解及示例程式碼(可上傳到伺服器form標籤)

文章編排,我們首先來講一下input系列的各種內容,然後用一個示例程式碼來清晰的理解其中特定的含義 input系列: 1.輸入文字內容: <input type="text" name="user"/>起個名字易於在伺服器端進行處理 2.輸入密碼內容: