国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Flask 插件系列 - Flask-SQLAlchemy

LoftySoul / 2871人閱讀

摘要:程序中最常用的莫過于關(guān)系型數(shù)據(jù)庫了,也稱數(shù)據(jù)庫。對象是類的實(shí)例,表示程序使用的數(shù)據(jù)庫。本文由發(fā)表于個(gè)人博客,采用自由轉(zhuǎn)載保持署名非商用禁止演繹協(xié)議發(fā)布。非商業(yè)轉(zhuǎn)載請注明作者及出處。本文標(biāo)題為插件系列本文鏈接為更多閱讀

簡介

Web 開發(fā)中,一個(gè)重要的組成部分便是數(shù)據(jù)庫了。Web 程序中最常用的莫過于關(guān)系型數(shù)據(jù)庫了,也稱 SQL 數(shù)據(jù)庫。另外,文檔數(shù)據(jù)庫(如 mongodb)、鍵值對數(shù)據(jù)庫(如 redis)近幾年也逐漸在 web 開發(fā)中流行起來,我們習(xí)慣把這兩種數(shù)據(jù)庫稱為 NoSQL 數(shù)據(jù)庫。

大多數(shù)的關(guān)系型數(shù)據(jù)庫引擎(比如 MySQL、Postgres 和 SQLite)都有對應(yīng)的 Python 包。在這里,我們不直接使用這些數(shù)據(jù)庫引擎提供的 Python 包,而是使用對象關(guān)系映射(Object-Relational Mapper, ORM)框架,它將低層的數(shù)據(jù)庫操作指令抽象成高層的面向?qū)ο蟛僮鳌R簿褪钦f,如果我們直接使用數(shù)據(jù)庫引擎,我們就要寫 SQL 操作語句,但是,如果我們使用了 ORM 框架,我們對諸如表、文檔此類的數(shù)據(jù)庫實(shí)體就可以簡化成對 Python 對象的操作。

Python 中最廣泛使用的 ORM 框架是 SQLAlchemy,它是一個(gè)很強(qiáng)大的關(guān)系型數(shù)據(jù)庫框架,不僅支持高層的 ORM,也支持使用低層的 SQL 操作,另外,它也支持多種數(shù)據(jù)庫引擎,如 MySQL、Postgres 和 SQLite 等。

Flask-SQLAlchemy

在 Flask 中,為了簡化配置和操作,我們使用的 ORM 框架是 Flask-SQLAlchemy,這個(gè) Flask 擴(kuò)展封裝了 SQLAlchemy 框架。在 Flask-SQLAlchemy 中,數(shù)據(jù)庫使用 URL 指定,下表列出了常見的數(shù)據(jù)庫引擎和對應(yīng)的 URL。

數(shù)據(jù)庫引擎 URL
MySQL mysql://username:password@hostname/database
Postgres postgresql://username:password@hostname/database
SQLite (Unix) sqlite:////absolute/path/to/database
SQLite (Windows) sqlite:///c:/absolute/path/to/database

上面的表格中,username 和 password 表示登錄數(shù)據(jù)庫的用戶名和密碼,hostname 表示 SQL 服務(wù)所在的主機(jī),可以是本地主機(jī)(localhost)也可以是遠(yuǎn)程服務(wù)器,database 表示要使用的數(shù)據(jù)庫。有一點(diǎn)需要注意的是,SQLite 數(shù)據(jù)庫不需要使用服務(wù)器,它使用硬盤上的文件名作為 database。

一個(gè)最小的應(yīng)用 創(chuàng)建數(shù)據(jù)庫

首先,我們使用 pip 安裝 Flask-SQLAlchemy:

$ pip install flask-sqlalchemy

接下來,我們配置一個(gè)簡單的 SQLite 數(shù)據(jù)庫:

$ cat app.py
# -*- coding: utf-8 -*-

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///db/users.db"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True
db = SQLAlchemy(app)


class User(db.Model):
    """定義數(shù)據(jù)模型"""
    __tablename__ = "users"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return "" % self.username

這里有幾點(diǎn)需要注意的是:

app 應(yīng)用配置項(xiàng) SQLALCHEMY_DATABASE_URI 指定了 SQLAlchemy 所要操作的數(shù)據(jù)庫,這里我們使用的是 SQLite,數(shù)據(jù)庫 URL 以 sqlite:/// 開頭,后面的 db/users.db 表示數(shù)據(jù)庫文件存放在當(dāng)前目錄的 db 子目錄中的 users.db 文件。當(dāng)然,你也可以使用絕對路徑,如 /tmp/users.db 等。

db 對象是 SQLAlchemy 類的實(shí)例,表示程序使用的數(shù)據(jù)庫。

我們定義的 User 模型必須繼承自 db.Model這里的模型其實(shí)就對應(yīng)著數(shù)據(jù)庫中的表。其中,類變量__tablename__ 定義了在數(shù)據(jù)庫中使用的表名,如果該變量沒有被定義,F(xiàn)lask-SQLAlchemy 會使用一個(gè)默認(rèn)名字。

接著,我們創(chuàng)建表和數(shù)據(jù)庫。為此,我們先在當(dāng)前目錄創(chuàng)建 db 子目錄和新建一個(gè) users.db 文件,然后在交互式 Python shell 中導(dǎo)入 db 對象并調(diào)用 SQLAlchemy 類的 create_all() 方法:

$ mkdir db
$ python
>>> from app import db
>>> db.create_all()

我們驗(yàn)證一下,"users" 表是否創(chuàng)建成功:

$ sqlite3 db/users.db    # 打開數(shù)據(jù)庫文件
SQLite version 3.8.10.2 2015-05-20 18:17:19
Enter ".help" for usage hints.

sqlite> .schema users   # 查看 "user" 表的 schema
CREATE TABLE users (
        id INTEGER NOT NULL,
        username VARCHAR(80),
        email VARCHAR(120),
        PRIMARY KEY (id),
        UNIQUE (username),
        UNIQUE (email)
);
插入數(shù)據(jù)

現(xiàn)在,我們創(chuàng)建一些用戶,通過使用 db.session.add()來添加數(shù)據(jù):

@app.route("/adduser")
def add_user():
    user1 = User("ethan", "ethan@example.com")
    user2 = User("admin", "admin@example.com")
    user3 = User("guest", "guest@example.com")
    user4 = User("joe", "joe@example.com")
    user5 = User("michael", "michael@example.com")

    db.session.add(user1)
    db.session.add(user2)
    db.session.add(user3)
    db.session.add(user4)
    db.session.add(user5)

    db.session.commit()

    return "

add succssfully!"

這里有一點(diǎn)要注意的是,我們在將數(shù)據(jù)添加到會話后,在最后要記得調(diào)用 db.session.commit() 提交事務(wù),這樣,數(shù)據(jù)才會被寫入到數(shù)據(jù)庫。

查詢數(shù)據(jù)

查詢數(shù)據(jù)主要是用 query 接口,例如 all() 方法返回所有數(shù)據(jù),filter_by() 方法對查詢結(jié)果進(jìn)行過濾,參數(shù)是鍵值對,filter 方法也可以對結(jié)果進(jìn)行過濾,但參數(shù)是布爾表達(dá)式,詳細(xì)的介紹請查看這里。

>>> from app import User
>>> users = User.query.all()
>>> users
[, , , , ]
>>>
>>> user = User.query.filter_by(username="joe").first()
>>> user

>>> user.email
u"joe@example.com"
>>>
>>> user = User.query.filter(User.username=="ethan").first()
>>> user

如果我們想查看 SQLAlchemy 為查詢生成的原生 SQL 語句,只需要把 query 對象轉(zhuǎn)化成字符串:

>>> str(User.query.filter_by(username="guest"))
"SELECT users.id AS users_id, users.username AS users_username, users.email AS users_email 
FROM users 
WHERE users.username = :username_1"
分頁方法

分頁方法可以采用 limit()offset() 方法,比如從第 3 條記錄開始取(注意是從 0 開開始算起),并最多取 1 條記錄,可以這樣:

users = User.query.limit(1).offset(3)
更新數(shù)據(jù)

更新數(shù)據(jù)也用 add() 方法,如果存在要更新的對象,SQLAlchemy 就更新該對象而不是添加。

>>> from app import db
>>> from app import User
>>>
>>> admin = User.query.filter_by(username="admin").first()
>>>
>>> admin.email = "admin@hotmail.com"
>>> db.session.add(admin)
>>> db.session.commit()
>>>
>>> admin = User.query.filter_by(username="admin").first()
>>> admin.email
u"admin@hotmail.com"
刪除數(shù)據(jù)

刪除數(shù)據(jù)用 delete() 方法,同樣要記得 delete 數(shù)據(jù)后,要調(diào)用 commit() 提交事務(wù):

>>> from app import db
>>> from app import User
>>>
>>> admin = User.query.filter_by(username="admin").first()
>>> db.session.delete(admin)
>>> db.session.commit()

本文完整的代碼可在這里下載。

本文由 funhacks 發(fā)表于個(gè)人博客,采用 Creative Commons BY-NC-ND 4.0(自由轉(zhuǎn)載-保持署名-非商用-禁止演繹)協(xié)議發(fā)布。
非商業(yè)轉(zhuǎn)載請注明作者及出處。商業(yè)轉(zhuǎn)載請聯(lián)系作者本人。
本文標(biāo)題為: Flask 插件系列 - Flask-SQLAlchemy
本文鏈接為: https://funhacks.net/2016/11/...

更多閱讀

Flask-SQLAlchemy

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/44244.html

相關(guān)文章

  • Flask 插件系列 - Flask-MongoEngine

    摘要:查詢數(shù)據(jù)查詢所有數(shù)據(jù)使用方法查詢滿足某些條件的數(shù)據(jù)其中,方法會取出滿足條件的第條記錄。本文由發(fā)表于個(gè)人博客,采用自由轉(zhuǎn)載保持署名非商用禁止演繹協(xié)議發(fā)布。非商業(yè)轉(zhuǎn)載請注明作者及出處。本文標(biāo)題為插件系列本文鏈接為更多閱讀 簡介 MongoDB 是一個(gè)文檔型數(shù)據(jù)庫,是 NoSQL (not only SQL) 的一種,具有靈活、易擴(kuò)展等諸多優(yōu)點(diǎn),受到許多開發(fā)者的青睞。MongoEngine ...

    Backache 評論0 收藏0
  • mdwiki開發(fā)之路一技術(shù)選型

    摘要:是一款系統(tǒng),可以作為個(gè)人或小型團(tuán)隊(duì)的知識庫管理系統(tǒng)。再加上目前開始學(xué)習(xí)與爬蟲。技術(shù)選型作為新手,義不容辭為什么就為了原生支持開玩笑因?yàn)榇砹说奈磥恚以絹碓蕉嗟膸煲呀?jīng)遷移到了,沒有什么理由不選擇它。 mdwiki是一款markdown wiki系統(tǒng),可以作為個(gè)人或小型團(tuán)隊(duì)的知識庫管理系統(tǒng)。項(xiàng)目地址:本系列文章最后一篇給出(需要時(shí)間整理和測試) 為什么我要開發(fā)mdwiki? 目前本人的...

    pubdreamcc 評論0 收藏0
  • mdwiki開發(fā)之路一技術(shù)選型

    摘要:是一款系統(tǒng),可以作為個(gè)人或小型團(tuán)隊(duì)的知識庫管理系統(tǒng)。再加上目前開始學(xué)習(xí)與爬蟲。技術(shù)選型作為新手,義不容辭為什么就為了原生支持開玩笑因?yàn)榇砹说奈磥恚以絹碓蕉嗟膸煲呀?jīng)遷移到了,沒有什么理由不選擇它。 mdwiki是一款markdown wiki系統(tǒng),可以作為個(gè)人或小型團(tuán)隊(duì)的知識庫管理系統(tǒng)。項(xiàng)目地址:本系列文章最后一篇給出(需要時(shí)間整理和測試) 為什么我要開發(fā)mdwiki? 目前本人的...

    李昌杰 評論0 收藏0
  • Flask-SQLAlchemy 學(xué)習(xí)總結(jié)

    摘要:初始化和配置對象關(guān)系映射。的則需要在中聲明。例如配置信息中指出是可以綁定多個(gè)數(shù)據(jù)庫引擎。是通過解決一對多的關(guān)系。將會返回學(xué)院學(xué)生人數(shù)將會返回學(xué)生的學(xué)院信息的類實(shí)例。處理關(guān)系對象查詢中有詳細(xì)的說明。 初始化和配置 ORM(Object Relational Mapper) 對象關(guān)系映射。指將面對對象得方法映射到數(shù)據(jù)庫中的關(guān)系對象中。Flask-SQLAlchemy是一個(gè)Flask擴(kuò)展,能...

    whataa 評論0 收藏0
  • 從零開始用 Flask 搭建一個(gè)網(wǎng)站(二)

    摘要:從零開始用搭建一個(gè)網(wǎng)站一介紹了如何搭建環(huán)境,以及應(yīng)用基本項(xiàng)目結(jié)構(gòu)。我們要搭建的網(wǎng)站是管理第三方集成的控制臺,類似于。我們先定義一個(gè)用戶模型然后在文件夾下創(chuàng)建一個(gè)文件。 從零開始用 Flask 搭建一個(gè)網(wǎng)站(一) 介紹了如何搭建 Python 環(huán)境,以及 Flask 應(yīng)用基本項(xiàng)目結(jié)構(gòu)。我們要搭建的網(wǎng)站是管理第三方集成的控制臺,類似于 Slack。 本篇主要講解數(shù)據(jù)如何在 Flask 應(yīng)用...

    Coly 評論0 收藏0

發(fā)表評論

0條評論

LoftySoul

|高級講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<