摘要:程序中最常用的莫過于關系型數據庫了,也稱數據庫。對象是類的實例,表示程序使用的數據庫。本文由發(fā)表于個人博客,采用自由轉載保持署名非商用禁止演繹協(xié)議發(fā)布。非商業(yè)轉載請注明作者及出處。本文標題為插件系列本文鏈接為更多閱讀
簡介
Web 開發(fā)中,一個重要的組成部分便是數據庫了。Web 程序中最常用的莫過于關系型數據庫了,也稱 SQL 數據庫。另外,文檔數據庫(如 mongodb)、鍵值對數據庫(如 redis)近幾年也逐漸在 web 開發(fā)中流行起來,我們習慣把這兩種數據庫稱為 NoSQL 數據庫。
大多數的關系型數據庫引擎(比如 MySQL、Postgres 和 SQLite)都有對應的 Python 包。在這里,我們不直接使用這些數據庫引擎提供的 Python 包,而是使用對象關系映射(Object-Relational Mapper, ORM)框架,它將低層的數據庫操作指令抽象成高層的面向對象操作。也就是說,如果我們直接使用數據庫引擎,我們就要寫 SQL 操作語句,但是,如果我們使用了 ORM 框架,我們對諸如表、文檔此類的數據庫實體就可以簡化成對 Python 對象的操作。
Python 中最廣泛使用的 ORM 框架是 SQLAlchemy,它是一個很強大的關系型數據庫框架,不僅支持高層的 ORM,也支持使用低層的 SQL 操作,另外,它也支持多種數據庫引擎,如 MySQL、Postgres 和 SQLite 等。
Flask-SQLAlchemy在 Flask 中,為了簡化配置和操作,我們使用的 ORM 框架是 Flask-SQLAlchemy,這個 Flask 擴展封裝了 SQLAlchemy 框架。在 Flask-SQLAlchemy 中,數據庫使用 URL 指定,下表列出了常見的數據庫引擎和對應的 URL。
數據庫引擎 | 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 表示登錄數據庫的用戶名和密碼,hostname 表示 SQL 服務所在的主機,可以是本地主機(localhost)也可以是遠程服務器,database 表示要使用的數據庫。有一點需要注意的是,SQLite 數據庫不需要使用服務器,它使用硬盤上的文件名作為 database。
一個最小的應用 創(chuàng)建數據庫首先,我們使用 pip 安裝 Flask-SQLAlchemy:
$ pip install flask-sqlalchemy
接下來,我們配置一個簡單的 SQLite 數據庫:
$ 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): """定義數據模型""" __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
這里有幾點需要注意的是:
app 應用配置項 SQLALCHEMY_DATABASE_URI 指定了 SQLAlchemy 所要操作的數據庫,這里我們使用的是 SQLite,數據庫 URL 以 sqlite:/// 開頭,后面的 db/users.db 表示數據庫文件存放在當前目錄的 db 子目錄中的 users.db 文件。當然,你也可以使用絕對路徑,如 /tmp/users.db 等。
db 對象是 SQLAlchemy 類的實例,表示程序使用的數據庫。
我們定義的 User 模型必須繼承自 db.Model,這里的模型其實就對應著數據庫中的表。其中,類變量__tablename__ 定義了在數據庫中使用的表名,如果該變量沒有被定義,F(xiàn)lask-SQLAlchemy 會使用一個默認名字。
接著,我們創(chuàng)建表和數據庫。為此,我們先在當前目錄創(chuàng)建 db 子目錄和新建一個 users.db 文件,然后在交互式 Python shell 中導入 db 對象并調用 SQLAlchemy 類的 create_all() 方法:
$ mkdir db $ python >>> from app import db >>> db.create_all()
我們驗證一下,"users" 表是否創(chuàng)建成功:
$ sqlite3 db/users.db # 打開數據庫文件 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) );插入數據
現(xiàn)在,我們創(chuàng)建一些用戶,通過使用 db.session.add()來添加數據:
@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!"
這里有一點要注意的是,我們在將數據添加到會話后,在最后要記得調用 db.session.commit() 提交事務,這樣,數據才會被寫入到數據庫。
查詢數據查詢數據主要是用 query 接口,例如 all() 方法返回所有數據,filter_by() 方法對查詢結果進行過濾,參數是鍵值對,filter 方法也可以對結果進行過濾,但參數是布爾表達式,詳細的介紹請查看這里。
>>> 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 對象轉化成字符串:
>>> 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)更新數據
更新數據也用 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"刪除數據
刪除數據用 delete() 方法,同樣要記得 delete 數據后,要調用 commit() 提交事務:
>>> 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ā)表于個人博客,采用 Creative Commons BY-NC-ND 4.0(自由轉載-保持署名-非商用-禁止演繹)協(xié)議發(fā)布。
非商業(yè)轉載請注明作者及出處。商業(yè)轉載請聯(lián)系作者本人。
本文標題為: Flask 插件系列 - Flask-SQLAlchemy
本文鏈接為: https://funhacks.net/2016/11/...
Flask-SQLAlchemy
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://www.ezyhdfw.cn/yun/44244.html
摘要:查詢數據查詢所有數據使用方法查詢滿足某些條件的數據其中,方法會取出滿足條件的第條記錄。本文由發(fā)表于個人博客,采用自由轉載保持署名非商用禁止演繹協(xié)議發(fā)布。非商業(yè)轉載請注明作者及出處。本文標題為插件系列本文鏈接為更多閱讀 簡介 MongoDB 是一個文檔型數據庫,是 NoSQL (not only SQL) 的一種,具有靈活、易擴展等諸多優(yōu)點,受到許多開發(fā)者的青睞。MongoEngine ...
摘要:是一款系統(tǒng),可以作為個人或小型團隊的知識庫管理系統(tǒng)。再加上目前開始學習與爬蟲。技術選型作為新手,義不容辭為什么就為了原生支持開玩笑因為代表了的未來,而且越來越多的庫已經遷移到了,沒有什么理由不選擇它。 mdwiki是一款markdown wiki系統(tǒng),可以作為個人或小型團隊的知識庫管理系統(tǒng)。項目地址:本系列文章最后一篇給出(需要時間整理和測試) 為什么我要開發(fā)mdwiki? 目前本人的...
摘要:是一款系統(tǒng),可以作為個人或小型團隊的知識庫管理系統(tǒng)。再加上目前開始學習與爬蟲。技術選型作為新手,義不容辭為什么就為了原生支持開玩笑因為代表了的未來,而且越來越多的庫已經遷移到了,沒有什么理由不選擇它。 mdwiki是一款markdown wiki系統(tǒng),可以作為個人或小型團隊的知識庫管理系統(tǒng)。項目地址:本系列文章最后一篇給出(需要時間整理和測試) 為什么我要開發(fā)mdwiki? 目前本人的...
摘要:初始化和配置對象關系映射。的則需要在中聲明。例如配置信息中指出是可以綁定多個數據庫引擎。是通過解決一對多的關系。將會返回學院學生人數將會返回學生的學院信息的類實例。處理關系對象查詢中有詳細的說明。 初始化和配置 ORM(Object Relational Mapper) 對象關系映射。指將面對對象得方法映射到數據庫中的關系對象中。Flask-SQLAlchemy是一個Flask擴展,能...
摘要:從零開始用搭建一個網站一介紹了如何搭建環(huán)境,以及應用基本項目結構。我們要搭建的網站是管理第三方集成的控制臺,類似于。我們先定義一個用戶模型然后在文件夾下創(chuàng)建一個文件。 從零開始用 Flask 搭建一個網站(一) 介紹了如何搭建 Python 環(huán)境,以及 Flask 應用基本項目結構。我們要搭建的網站是管理第三方集成的控制臺,類似于 Slack。 本篇主要講解數據如何在 Flask 應用...
閱讀 2471·2023-04-26 02:54
閱讀 2409·2021-10-14 09:43
閱讀 3501·2021-09-22 15:19
閱讀 2901·2019-08-30 15:44
閱讀 2763·2019-08-30 12:54
閱讀 1047·2019-08-29 18:43
閱讀 1996·2019-08-29 17:12
閱讀 1384·2019-08-29 16:40