国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

快速上手Flask(三) 在 Flask應(yīng)用中使用Flask-SQLAlchemy(flask SQLAlchemy模型對象如何json序列化輸出)

這篇具有很好參考價值的文章主要介紹了快速上手Flask(三) 在 Flask應(yīng)用中使用Flask-SQLAlchemy(flask SQLAlchemy模型對象如何json序列化輸出)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

快速上手Flask(三) 在 Flask應(yīng)用中使用Flask-SQLAlchemy

常見情況下對于只有一個 Flask 應(yīng)用,所有您需要做的事情就是創(chuàng)建 Flask 應(yīng)用,選擇加載配置接著創(chuàng)建 SQLAlchemy 對象時候把 Flask 應(yīng)用傳遞給它作為參數(shù)。

SQLAlchemy

官網(wǎng):https://www.sqlalchemy.org/

參考本人 文章:python常用庫之數(shù)據(jù)庫orm框架之SQLAlchemy

什么是Flask-SQLAlchemy

官方文檔:
中文:http://www.pythondoc.com/flask-sqlalchemy/index.html
[推薦]英文:https://flask-sqlalchemy.palletsprojects.com/en/3.1.x/

Flask-SQLAlchemy是一個Flask擴展,用于在Flask應(yīng)用程序中簡化與SQL數(shù)據(jù)庫的交互。它提供了一個集成的ORM(對象關(guān)系映射)工具,使得在Flask應(yīng)用程序中進行數(shù)據(jù)庫操作更加方便和高效。

Flask-SQLAlchemy 和 SQLAlchemy的區(qū)別?

Flask-SQLAlchemy 是基于 SQLAlchemy 的 Flask 擴展,它提供了在 Flask 應(yīng)用中更方便地使用 SQLAlchemy 的功能和特性。

  • 集成度:Flask-SQLAlchemy 是針對 Flask 框架的封裝,提供了與 Flask 應(yīng)用無縫集成的功能。它簡化了在 Flask 應(yīng)用中使用 SQLAlchemy 的配置和使用過程,提供了更簡潔的接口和功能。

  • 配置:Flask-SQLAlchemy 提供了在 Flask 應(yīng)用中配置 SQLAlchemy 的方式,可以直接在 Flask 配置中進行數(shù)據(jù)庫相關(guān)的配置。而 SQLAlchemy 需要單獨進行配置,通常使用一個獨立的配置文件或模塊。

  • 上下文管理:Flask-SQLAlchemy 自動處理了 SQLAlchemy 的上下文管理,確保在每個請求中使用正確的數(shù)據(jù)庫會話。它與 Flask 的應(yīng)用上下文和請求上下文無縫集成,提供了更方便的數(shù)據(jù)庫操作方式。

  • 擴展功能:Flask-SQLAlchemy 提供了一些額外的功能和特性,如自動提交和回滾事務(wù)、自動創(chuàng)建數(shù)據(jù)庫表、數(shù)據(jù)庫遷移等。它還與 Flask-WTF 和 Flask-Admin 等其他 Flask 擴展集成得更緊密,提供了更豐富的功能和集成選項。

總結(jié):

  1. SQLAlchemy:是一個獨立的ORM框架,可以獨立與Flask存在,也可以在其他項目中使用,比如在Django中。
  2. Flask-SQLAlchemy:對SQLAlchemy的一個封裝,能夠更適合在Flask中使用。

您僅需要知道與普通的 SQLAlchemy 不同之處:

  1. SQLAlchemy 允許您訪問下面的東西:
    • sqlalchemy 和 sqlalchemy.orm 下所有的函數(shù)和類
    • 一個叫做 session 的預(yù)配置范圍的會話(session)
    • metadata 屬性
    • engine 屬性
    • SQLAlchemy.create_all() 和 SQLAlchemy.drop_all(),根據(jù)模型用來創(chuàng)建以及刪除表格的方法
    • 一個 Model 基類,即是一個已配置的聲明(declarative)的基礎(chǔ)(base)
  2. Model 聲明基類行為類似一個常規(guī)的 Python 類,不過有個 query 屬性,可以用來查詢模型 (Model 和 BaseQuery)
  3. 您必須提交會話,但是沒有必要在每個請求后刪除它(session),F(xiàn)lask-SQLAlchemy 會幫您完成刪除操作。

Flask-SQLAlchemy基本使用

安裝:

pip install -U Flask-SQLAlchemy

快速入門

快速入門
參考URL: http://www.pythondoc.com/flask-sqlalchemy/quickstart.html

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:tmp/test.db'
db = SQLAlchemy(app)


class User(db.Model):
    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

在 Flask 中使用 SQLAlchemy 進行數(shù)據(jù)庫操作時,你應(yīng)該在全局范圍內(nèi)創(chuàng)建一個 db 對象。

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine
from sqlalchemy.pool import QueuePool

db = SQLAlchemy()

# 數(shù)據(jù)庫連接配置
DATABASE_URI = 'postgresql://username:password@localhost:5432/database_name'
DATABASE_TRACK_MODIFICATIONS = False

# SQLAlchemy配置
SQLALCHEMY_DATABASE_URI = DATABASE_URI
SQLALCHEMY_TRACK_MODIFICATIONS = DATABASE_TRACK_MODIFICATIONS
SQLALCHEMY_ENGINE_OPTIONS = {
    'poolclass': QueuePool,
    'pool_size': 10,
    'max_overflow': 5,
    'pool_pre_ping': True
}

# 創(chuàng)建數(shù)據(jù)庫引擎
engine = create_engine(DATABASE_URI, poolclass=QueuePool, pool_size=10, max_overflow=5, pool_pre_ping=True)

SQLALCHEMY_ENGINE_OPTIONS:這是SQLAlchemy的引擎配置選項,用于配置連接池的相關(guān)參數(shù),例如pool_size和max_overflow。
engine:這是使用create_engine函數(shù)創(chuàng)建的數(shù)據(jù)庫引擎對象,可以在需要直接使用底層引擎的情況下使用。

在你的代碼中,你已經(jīng)正確地創(chuàng)建了一個 db 對象,并將其與 Flask 應(yīng)用程序綁定。這樣做可以確保在整個應(yīng)用程序中使用相同的數(shù)據(jù)庫實例。

from flask import Flask
from api import create_app
from sqlalchemy_db import db, SQLALCHEMY_DATABASE_URI, SQLALCHEMY_TRACK_MODIFICATIONS, SQLALCHEMY_ENGINE_OPTIONS

app = create_app(os.getenv('FLASK_CONFIG') or 'default')

# 配置數(shù)據(jù)庫連接URI和選項
app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = SQLALCHEMY_TRACK_MODIFICATIONS
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = SQLALCHEMY_ENGINE_OPTIONS

# 將db對象與Flask應(yīng)用程序關(guān)聯(lián)
db.init_app(app)

在執(zhí)行原生SQL語句時,使用engine對象。

以下是一個示例代碼,演示了如何使用engine對象執(zhí)行原生SQL查詢:

from sqlalchemy_db import engine

def execute_native_sql(query):
    with engine.connect() as connection:
        result = connection.execute(query)
        for row in result:
            print(row)

# 示例查詢
query = "SELECT * FROM users"
execute_native_sql(query)

在上面的代碼中,我們創(chuàng)建了一個execute_native_sql函數(shù),它使用engine對象執(zhí)行原生SQL查詢并打印結(jié)果。

請注意,在使用engine對象時,你需要根據(jù)具體的情況選擇適當?shù)纳舷挛墓芾砥鳎╳ith語句)來保證連接的正確關(guān)閉。

如果你只是想使用SQLAlchemy的ORM功能(例如定義模型類、執(zhí)行查詢等),則可以直接使用db對象,而不需要直接使用engine對象。

創(chuàng)建模型

在使用SQLAlchemy之前,你需要先定義數(shù)據(jù)庫模型類。模型類代表了數(shù)據(jù)庫中的表結(jié)構(gòu),并提供了與表相關(guān)聯(lián)的字段和方法。

from sqlalchemy_db import db

class User(db.Model):
    __tablename__ = 'users'
    
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), unique=True, nullable=False)
    email = db.Column(db.String(100), unique=True, nullable=False)
    
    def __repr__(self):
        return f'<User(id={self.id}, username={self.username}, email={self.email})>'

在上面的示例中,我們定義了一個名為User的模型類,它對應(yīng)了數(shù)據(jù)庫中的users表。User類繼承了db.Model,這是SQLAlchemy提供的基類。

from sqlalchemy_db import db
from models import User

# 創(chuàng)建數(shù)據(jù)庫表
db.create_all()

# 創(chuàng)建一個新用戶
user = User(username='john', email='john@example.com')
db.session.add(user)
db.session.commit()

# 查詢所有用戶
users = User.query.all()
for user in users:
    print(user)

# 查詢特定用戶
user = User.query.filter_by(username='john').first()
print(user)

# 更新用戶信息
user.email = 'newemail@example.com'
db.session.commit()

# 刪除用戶
db.session.delete(user)
db.session.commit()

我們使用db.session來進行數(shù)據(jù)庫操作,例如添加、查詢、更新和刪除用戶記錄。

flask模型對象如何json序列化輸出

[推薦]Flask 學(xué)習(xí)-36.Flask-RESTful 序列化輸出對象
參考URL:https://www.cnblogs.com/yoyoketang/p/16648730.html

通過flask-SQLAlchemy這一ORM工具所構(gòu)建的數(shù)據(jù)庫表模型,通過其語句所取出的數(shù)據(jù)通常是object類型的,這一類型并不能直接在方法中return返回一個JSON格式,因此需要先對從數(shù)據(jù)庫中取出的數(shù)據(jù)進行序列化,然后再return給前端。

在網(wǎng)絡(luò)上找到的三種序列化方法如下:

在模型定義的時候給序列化的方法
繼承改寫 flask 里面的 JSONEncoder類以及default方法
使用Marshmallow

裝飾器marshal_with實際上是獲取您的數(shù)據(jù)對象并應(yīng)用字段過濾。編組可以處理單個對象、字典或?qū)ο罅斜怼?/p>

https://www.cnblogs.com/yoyoketang/p/16648730.html

使用Flask-RESTful 提供的 fields 模塊序列化輸出需要的字段

from flask_restful import Resource, fields, marshal_with

user_fields = {
‘id’: fields.Integer,
‘username’: fields.String,
‘is_active’: fields.Boolean
}

class UserInfo(Resource):

@marshal_with(user_fields)
def get(self):
    user = Users.query.get(1)
    print(f'查詢到的數(shù)據(jù):{user}')
    return user

marshal_with 裝飾器只能對return的對象序列化,這里可以使用 marshal() 函數(shù)實現(xiàn)部分序列化

數(shù)據(jù)庫的增刪改查

Flask和SQLAlchemy的模型操作:增刪改查方法詳解
參考URL: https://www.51cto.com/article/757138.html

查詢模型
在Flask和SQLAlchemy中,我們可以使用以下方法來查詢模型:

查詢所有模型:

users = User.query.all()

這將返回所有的用戶模型對象。

查詢單個模型:

user = User.query.filter_by(username='john').first()

這將返回一個用戶名為’john’的用戶模型對象。

使用復(fù)雜查詢:

users = User.query.filter(User.email.endswith('@example.com')).all()

這將返回所有電子郵件以’@example.com’結(jié)尾的用戶模型對象。

修改模型
在Flask和SQLAlchemy中,我們可以使用以下方法來修改模型:

修改單個屬性:

user = User.query.filter_by(username='john').first()
user.email = 'newemail@example.com'
db.session.commit()

修改多個屬性:

user = User.query.filter_by(username='john').first()
user.email = 'newemail@example.com'
user.password = 'newpassword'
db.session.commit()

這將修改用戶名為’john’的用戶的電子郵件和密碼,并將更改保存到數(shù)據(jù)庫。

刪除模型
在Flask和SQLAlchemy中,我們可以使用以下方法來刪除模型:

刪除單個模型:

user = User.query.filter_by(username='john').first()
db.session.delete(user)
db.session.commit()

這將刪除用戶名為’john’的用戶模型對象,并將更改保存到數(shù)據(jù)庫。

刪除多個模型:

users = User.query.filter_by(email='oldemail@example.com').all()
for user in users:
    db.session.delete(user)
db.session.commit()

完整的代碼示例如下:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password = db.Column(db.String(120), nullable=False)

    def __repr__(self):
        return '<User %r>' % self.username

# create database tables
db.create_all()

# add a new user to the database
user = User(username='john', email='john@example.com', password='password')
db.session.add(user)
db.session.commit()

# query all users
users = User.query.all()
print(users)

# query a single user
user = User.query.filter_by(username='john').first()
print(user)

# modify a user's email
user = User.query.filter_by(username='john').first()
user.email = 'newemail@example.com'
user.password = 'newpassword'
db.session.commit()

# delete a user
user = User.query.filter_by(username='john').first()
db.session.delete(user)
db.session.commit()

首先定義了一個User模型類,并使用db.create_all()方法創(chuàng)建了數(shù)據(jù)庫表格。接著,我們添加了一個新用戶到數(shù)據(jù)庫中,并使用User.query.all()和User.query.filter_by()方法查詢了用戶。然后,我們修改了用戶的電子郵件和密碼,并使用db.session.commit()方法將更改保存到數(shù)據(jù)庫。最后,我們使用db.session.delete()方法刪除了用戶,并使用db.session.commit()方法將更改保存到數(shù)據(jù)庫。

工作常用總結(jié)

在 SQLAlchemy 中,怎么判斷刪除是否成功?

官方文檔:https://docs.sqlalchemy.org/en/14/orm/query.html#sqlalchemy.orm.Query.delete

在 SQLAlchemy 中,可以使用 execute() 方法執(zhí)行 DELETE 語句,delete() 方法返回的是一個整數(shù),表示被刪除的記錄數(shù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-823555.html

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
 
# 創(chuàng)建引擎和Session
engine = create_engine('sqlite:///test.db')
session = sessionmaker(bind=engine)()
 
try:
    # 定義模型類(這里以User為例)
    class User(Base):
        __tablename__ = 'users'
        
        id = Column(Integer, primary_key=True)
        name = Column(String)
    
    # 查詢所有名字為"John"的用戶
    users = session.query(User).filter(User.name == "John").all()
    
    if len(users) > 0:
        # 刪除第一個找到的用戶
        deleted_count = session.delete(users[0])
        print("已刪除{}個用戶".format(deleted_count))
        session.commit()
    else:
        print("未找到任何符合條件的用戶")
except Exception as e:
    print("刪除失?。?, str(e))
finally:
    session.close()

到了這里,關(guān)于快速上手Flask(三) 在 Flask應(yīng)用中使用Flask-SQLAlchemy(flask SQLAlchemy模型對象如何json序列化輸出)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Flask數(shù)據(jù)庫操作-Flask-SQLAlchemy

    Flask數(shù)據(jù)庫操作-Flask-SQLAlchemy

    Flask中一般使用flask-sqlalchemy來操作數(shù)據(jù)庫。flask-sqlalchemy的使用介紹如下: 一、SQLAlchemy SQLALchemy 實際上是對數(shù)據(jù)庫的抽象,讓開發(fā)者不用直接和 SQL 語句打交道,而是通過 Python 對象來操作數(shù)據(jù)庫,在舍棄一些性能開銷的同時,換來的是開發(fā)效率的較大提升。 SQLAlchemy是一個關(guān)

    2024年02月22日
    瀏覽(27)
  • python:使用Flask-SQLAlchemy對數(shù)據(jù)庫增刪改查的簡單示例

    python:使用Flask-SQLAlchemy對數(shù)據(jù)庫增刪改查的簡單示例

    以下將介紹Flask-SQLAlchemy對數(shù)據(jù)庫增刪改查的簡單示例。 一、安裝所需的庫 pip install flask flask-sqlalchemy flask-mysql 二、創(chuàng)建數(shù)據(jù)表 本示例使用mysql創(chuàng)建數(shù)據(jù)庫和表 CREATE TABLE `user` ( ? `id` int(11) NOT NULL AUTO_INCREMENT, ? `name` varchar(255) DEFAULT NULL, ? `age` int(11) DEFAULT NULL, ? PRIMARY KEY (`id

    2024年02月07日
    瀏覽(36)
  • Flask-SQLAlchemy事件鉤子介紹

    Flask-SQLAlchemy事件鉤子介紹

    前幾天在搜資料的時候無意中看到有介紹SQLAlchemy觸發(fā)器,當時感覺挺奇怪的,觸發(fā)器不是數(shù)據(jù)庫層面的概念嗎,怎么flask-SQLAlchemy這個ORM框架會有這玩意。 考慮到效率博客表中有兩個字段,body用于存儲markdown源文本,body_html存儲轉(zhuǎn)換成html的內(nèi)容,這里就可以在保存數(shù)據(jù)時使用

    2024年02月06日
    瀏覽(25)
  • flask中的操作數(shù)據(jù)庫的插件Flask-SQLAlchemy

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

    Web 開發(fā)中,一個重要的組成部分便是數(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ù)庫引

    2024年02月09日
    瀏覽(33)
  • 3.flask-sqlalchemy ORM庫

    Flask-SQLAlchemy是一個用于Flask的擴展,它提供了一個便捷的方式來處理數(shù)據(jù)庫操作。Flask-SQLAlchemy基于SQLAlchemy,一個功能強大的Python SQL工具包和對象關(guān)系映射(ORM)系統(tǒng) 官網(wǎng)文檔: http://www.pythondoc.com/flask-sqlalchemy/ 一對多關(guān)系是指一個模型與另一個模型之間存在多對一的關(guān)系。在

    2024年02月10日
    瀏覽(30)
  • Flask-sqlalchemy更新數(shù)據(jù)庫

    Flask-sqlalchemy更新數(shù)據(jù)庫

    Flask開發(fā)過程中,難免不會在開發(fā)工程中修改數(shù)據(jù)庫信息,如添加字段,修改字段類型等,F(xiàn)lask可以通過擴展庫flask-migrate來更新DEBUG中的工程數(shù)據(jù)庫,更新數(shù)據(jù)庫步驟如下: 1、首先需要安裝flask_migrate,pip install flask_migrate 2、因為flask_sqlalchemy是通過終端命令更新,所以需要f

    2023年04月08日
    瀏覽(15)
  • flask-sqlalchemy連接數(shù)據(jù)庫

    flask-sqlalchemy連接數(shù)據(jù)庫

    1、安裝flask_sqlalchemy和pymysql包 2、進行配置 使用Flask-SQLAlchemy擴展操作數(shù)據(jù)庫,首先需要通過URL建立數(shù)據(jù)庫連接,必須保存到Flask配置對象的SQLALCHEMY_DATABASE_URI中。 其中HOSTNAME為路由地址 PORT為端口號,我在創(chuàng)建數(shù)據(jù)庫時沒有更改,所以用的默認的3306端口號 DATABASE為數(shù)據(jù)庫名字

    2024年02月06日
    瀏覽(28)
  • flask-sqlalchemy結(jié)合Blueprint遇到循環(huán)引入問題的解決方案

    想要用flask_sqlalchemy結(jié)合Blueprint分模塊寫一下SQL的增刪改查接口,結(jié)果發(fā)現(xiàn)有循環(huán)引入問題。 一開始,我在app.py中使用db = SQLAlchemy(app)創(chuàng)建數(shù)據(jù)庫對象;并且使用app.register_blueprint(db_bp, url_prefix=\\\'/db\\\')注冊藍圖。 這使得我的依賴關(guān)系是這樣的。db.py → app,py 中的db對象;app.py →

    2024年02月07日
    瀏覽(16)
  • flask---》更多查詢方式/連表查詢/原生sql(django-orm如何執(zhí)行原生sql)/flask-sqlalchemy

    sqlalchemy執(zhí)行原生sql django執(zhí)行原生sql

    2024年02月13日
    瀏覽(23)
  • 【flask sqlalchmey】一次性將返回的列表對象或者 一行數(shù)據(jù)對象轉(zhuǎn)成dict---flask-sqlalchemy輸出json格式數(shù)據(jù)

    結(jié)果示例: 另外: res = Sysdict.query.all() 這種寫法已經(jīng)不被推薦了, 推薦的是scalar_one() 獲取一行,scalars()獲取多行 user = db.session.execute(db.select(User).filter_by(username=username)).scalar_one() users = db.session.execute(db.select(User).order_by(User.username)).scalars() 一般的 json.dumps(users) 或者 jsonify(use

    2024年02月13日
    瀏覽(80)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包