最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

flask操作數(shù)據(jù)庫(kù)插件Flask-SQLAlchemy的使用

 更新時(shí)間:2023年09月06日 11:27:30   作者:javascript_good  
Python?中最廣泛使用的ORM框架是SQLAlchemy,它是一個(gè)很強(qiáng)大的關(guān)系型數(shù)據(jù)庫(kù)框架,本文就來(lái)介紹一下flask操作數(shù)據(jù)庫(kù)插件Flask-SQLAlchemy的使用,感興趣的可以了解一下

1、ORM 框架

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

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

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

2、Flask-SQLAlchemy

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

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

3、一個(gè)最小的應(yīng)用

創(chuàng)建數(shù)據(jù)庫(kù)

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

pip install flask-sqlalchemy

接下來(lái),我們配置一個(gè)簡(jiǎn)單的 SQLite 數(shù)據(jù)庫(kù):

$ 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 '<User %r>' % self.username

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

  • app 應(yīng)用配置項(xiàng) SQLALCHEMY_DATABASE_URI 指定了 SQLAlchemy 所要操作的數(shù)據(jù)庫(kù),這里我們使用的是 SQLite,數(shù)據(jù)庫(kù) URL 以 sqlite:/// 開(kāi)頭,后面的 db/users.db 表示數(shù)據(jù)庫(kù)文件存放在當(dāng)前目錄的 db 子目錄中的 users.db 文件。當(dāng)然,你也可以使用絕對(duì)路徑,如 /tmp/users.db 等。
  • db 對(duì)象是 SQLAlchemy 類(lèi)的實(shí)例,表示程序使用的數(shù)據(jù)庫(kù)。
  • 我們定義的 User 模型必須繼承自 db.Model,這里的模型其實(shí)就對(duì)應(yīng)著數(shù)據(jù)庫(kù)中的表。其中,類(lèi)變量__tablename__ 定義了在數(shù)據(jù)庫(kù)中使用的表名,如果該變量沒(méi)有被定義,F(xiàn)lask-SQLAlchemy 會(huì)使用一個(gè)默認(rèn)名字。
    接著,我們創(chuàng)建表和數(shù)據(jù)庫(kù)。為此,我們先在當(dāng)前目錄創(chuàng)建 db 子目錄和新建一個(gè) users.db 文件,然后在交互式 Python shell 中導(dǎo)入 db 對(duì)象并調(diào)用 SQLAlchemy 類(lèi)的 create_all() 方法:
$ mkdir db
$ python
>>> from app import db
>>> db.create_all()

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

$ sqlite3 db/users.db    # 打開(kāi)數(shù)據(jù)庫(kù)文件
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ù)

我們創(chuàng)建一些用戶(hù),通過(guò)使用 db.session.add()來(lái)添加數(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 "<p>add succssfully!"

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

查詢(xún)數(shù)據(jù)

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

>>> from app import User
>>> users = User.query.all()
>>> users
[<User u'ethan'>, <User u'admin'>, <User u'guest'>, <User u'joe'>, <User u'michael'>]
>>>
>>> user = User.query.filter_by(username='joe').first()
>>> user
<User u'joe'>
>>> user.email
u'joe@example.com'
>>>
>>> user = User.query.filter(User.username=='ethan').first()
>>> user
<User u'ethan'>

如果我們想查看 SQLAlchemy 為查詢(xún)生成的原生 SQL 語(yǔ)句,只需要把 query 對(duì)象轉(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 \nFROM users \nWHERE users.username = :username_1'

分頁(yè)方法

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

users = User.query.limit(1).offset(3)

更新數(shù)據(jù)

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

>>> 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()

 到此這篇關(guān)于flask操作數(shù)據(jù)庫(kù)插件Flask-SQLAlchemy的使用的文章就介紹到這了,更多相關(guān)Flask-Sqlalchemy 使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • django中類(lèi)屬性和類(lèi)方法的實(shí)現(xiàn)

    django中類(lèi)屬性和類(lèi)方法的實(shí)現(xiàn)

    在django中,類(lèi)的屬性可以直接在實(shí)例化對(duì)象或類(lèi)中調(diào)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • python中的元組與列表及元組的更改

    python中的元組與列表及元組的更改

    這篇文章主要介紹了python中的元組與列表及元組的更改,元組是由一對(duì)方括號(hào)構(gòu)成的序列。列表創(chuàng)建后,可以根據(jù)自己的需要改變他的內(nèi)容,下面更多詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-03-03
  • Python3.8官網(wǎng)文檔之類(lèi)的基礎(chǔ)語(yǔ)法閱讀

    Python3.8官網(wǎng)文檔之類(lèi)的基礎(chǔ)語(yǔ)法閱讀

    類(lèi)提供了一種組合數(shù)據(jù)和功能的方法,今天通過(guò)本文給大家分享Python3.8官網(wǎng)文檔之類(lèi)的基礎(chǔ)語(yǔ)法閱讀知識(shí),感興趣的朋友跟隨小編一起看看吧
    2021-09-09
  • Spark處理數(shù)據(jù)排序問(wèn)題如何避免OOM

    Spark處理數(shù)據(jù)排序問(wèn)題如何避免OOM

    這篇文章主要介紹了Spark處理數(shù)據(jù)排序問(wèn)題如何避免OOM,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Python 集合之set詳解

    Python 集合之set詳解

    這篇文章主要介紹了python基礎(chǔ)之set集合詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-09-09
  • Python OpenCV 使用滑動(dòng)條來(lái)調(diào)整函數(shù)參數(shù)的方法

    Python OpenCV 使用滑動(dòng)條來(lái)調(diào)整函數(shù)參數(shù)的方法

    這篇文章主要介紹了Python OpenCV 使用滑動(dòng)條來(lái)調(diào)整函數(shù)參數(shù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python實(shí)現(xiàn)中文大寫(xiě)金額轉(zhuǎn)阿拉伯?dāng)?shù)字

    Python實(shí)現(xiàn)中文大寫(xiě)金額轉(zhuǎn)阿拉伯?dāng)?shù)字

    在財(cái)務(wù)票據(jù)中,中文大寫(xiě)金額被廣泛使用以防止篡改,但在數(shù)據(jù)處理時(shí),我們需要將其轉(zhuǎn)換為阿拉伯?dāng)?shù)字形式,下面我們就來(lái)看看如何使用Python實(shí)現(xiàn)這一轉(zhuǎn)換吧
    2025-08-08
  • 本地部署Python?Flask并搭建web問(wèn)答應(yīng)用程序框架實(shí)現(xiàn)遠(yuǎn)程訪問(wèn)的操作方法

    本地部署Python?Flask并搭建web問(wèn)答應(yīng)用程序框架實(shí)現(xiàn)遠(yuǎn)程訪問(wèn)的操作方法

    Flask是一個(gè)Python編寫(xiě)的Web微框架,使用Python語(yǔ)言快速實(shí)現(xiàn)一個(gè)網(wǎng)站或Web服務(wù),本期教程我們使用Python Flask搭建一個(gè)web問(wèn)答應(yīng)用程序框架,并結(jié)合cpolar內(nèi)網(wǎng)穿透工具將我們的應(yīng)用程序發(fā)布到公共網(wǎng)絡(luò)上,實(shí)現(xiàn)可多人遠(yuǎn)程進(jìn)入到該web應(yīng)用程序訪問(wèn),需要的朋友可以參考下
    2023-12-12
  • Python中pathlib庫(kù)的使用小結(jié)

    Python中pathlib庫(kù)的使用小結(jié)

    本文介紹了Python內(nèi)置的pathlib模塊,用于更簡(jiǎn)潔地處理文件系統(tǒng)路徑,通過(guò)示例展示了Path類(lèi)的方法,如獲取文件名、前綴和后綴、文件夾路徑、文件詳細(xì)信息、檢查文件存在性、遍歷目錄等,感興趣的可以了解一下
    2025-11-11
  • Python繪圖庫(kù)之pyqtgraph的用法詳解

    Python繪圖庫(kù)之pyqtgraph的用法詳解

    PyQtGraph建立在Qt QGraphicsScene的原生庫(kù),可提供更好更高性能繪圖能力,特別是對(duì)于實(shí)時(shí)數(shù)據(jù),可以提供交互性和使用Qt圖形小部件輕松自定義繪圖的能力。本文就來(lái)解釋一下pyqtgraph的用法,需要的可以收藏一下
    2022-12-12

最新評(píng)論

伊川县| 银川市| 镇远县| 武宁县| 依安县| 灵寿县| 双桥区| 普定县| 二连浩特市| 云阳县| 保德县| 阿克| 定安县| 抚顺市| 札达县| 西宁市| 青海省| 古浪县| 罗江县| 呼和浩特市| 蓝山县| 西吉县| 法库县| 双牌县| 乌拉特后旗| 卓资县| 遵化市| 紫阳县| 上犹县| 资源县| 洛阳市| 新蔡县| 通山县| 抚顺市| 桑日县| 滦南县| 拉孜县| 宁武县| 石景山区| 茶陵县| 钟山县|