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

詳解如何使用SQLAlchemy連接數(shù)據(jù)庫

 更新時間:2023年11月18日 10:03:00   作者:Hunter后端  
這篇文章主要為大家詳細介紹了如何使用 SQLAlchemy 連接數(shù)據(jù)庫、建立模型、操作表、以及查詢操作表數(shù)據(jù)等內(nèi)容,感興趣的小伙伴可以跟隨小編一起學習一下

相對于 Django 來說,F(xiàn)lask 并沒有 Django 中自帶的那種 ORM 框架,但是我們可以利用第三方的 ORM 框架來進行操作,比如我們這里介紹的 SQLAlchemy。

接下來這一篇筆記將會介紹如何使用 SQLAlchemy 連接數(shù)據(jù)庫、建立模型、操作表、以及查詢操作表數(shù)據(jù)等內(nèi)容。

0、模塊安裝

對于 SQLAlchemy 來說,它還需要使用 pymysql 這個庫來進行數(shù)據(jù)庫的操作,所以這里我們安裝的模塊如下:

pip3 install sqlalchemy==2.0.19
pip3 install pymysql==1.1.0

1、數(shù)據(jù)庫的連接與使用

以下是使用 SQLAlchemy 對數(shù)據(jù)庫進行連接以及一個簡單的查詢示例:

from sqlalchemy import create_engine, text

engine = create_engine("mysql+pymysql://root:123456@192.168.1.5:3306/db_test?charset=utf8")

with engine.connect() as conn:
    sql = "select id, name from users"
    result = conn.execute(text(sql))
    print(result.all())

# [(1, 'admin'), (2, 'user_1')]

在這里,我們預設(shè)在 db_test 這個庫下有一張表名為 users 的表,然后使用原生的 SQL 語句進行了查詢和打印操作,這個操作其實就跟直接使用 pymysql 模塊操作數(shù)據(jù)庫沒有區(qū)別。

如果是插入、更新語句的話,在后面還需要加上 conn.commit() 提交操作。

2、ORM 模型的建立與 ORM Session 的使用

接下來我們定義一個 ORM 模型,其實這里的 ORM 模型就跟 Django 的模型類似了,不過在語法上有一些區(qū)別:

from sqlalchemy.orm import DeclarativeBase
from sqlalchemy import Column, Integer, String, Text, DateTime, func

class Base(DeclarativeBase):
    pass


class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(50), unique=True, nullable=False, comment="用戶名")
    email = Column(String(120), default="", comment="郵箱")
    remark = Column(Text, default="", comment="備注信息")
    created_time = Column(DateTime, server_default=func.now(), comment="創(chuàng)建時間")
    updated_time = Column(DateTime, server_default=func.now(), onupdate=func.now(), comment="修改時間")

在這里,我們定義了一個 Base 類,繼承于 DeclarativeBase,DeclarativeBase 是用于定義 ORM 模型的基類,提供了一些方便的功能,使得使用 ORM 進行數(shù)據(jù)庫操作更加簡單和直觀,比如提供了一些 query 的方法,這個我們后面再介紹。

對于 User 這個 class,一個類似于 Django 的 ORM 的 SQLAlchemy 的 ORM 模型就搭建完成了。

其中,IntegerString,Text,DateTime 這些都是各自對應(yīng)到數(shù)據(jù)庫的字段

對于定義的 Column(),有很多字段的屬性,比如 primary_key 主鍵,auto_increment 自增,default 默認值,nullable 是否允許為 Null 等

在這里,created_time 和 updated_time 實現(xiàn)的是 Django 的日期時間字段里 auto_now_add 和 auto_now 屬性,即為創(chuàng)建或者修改的時候值為當前時間

接下來介紹一下 ORM Session 的定義,以下是一個示例:

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker

engine = create_engine("mysql+pymysql://root:123456@192.168.1.5:3306/db_test?charset=utf8")

db_session = scoped_session(
    sessionmaker(
        autoflush=False,
        bind=engine
    )
)

上面的操作中,sessionmaker() 通過 engine 創(chuàng)建了一個會話工廠對象,然后通過 scoped_session() 函數(shù)創(chuàng)建了一個 scoped_session 對象

我們可以直接使用上面定義出來的 db_session 對數(shù)據(jù)庫進行操作,也可以對其進行實例化后操作:

db_session.do_something()
// 直接用 db_session 操作數(shù)據(jù)庫

session = db_session()
session.db_something()
// 用 db_session 實例化結(jié)果操作數(shù)據(jù)庫

他們的使用對象雖然不同,但在功能上都提供了線程本地的會話對象,可以在多線程應(yīng)用程序中安全地使用。

3、表操作

下面介紹一下 SQLAlchemy 如何操作表。

1. 創(chuàng)建表

在前面我們定義了 engine 和 Base 基類和 User 這個表的 class 之后,我們可以使用下面的方式創(chuàng)建全部定義的表:

Base.metadata.create_all(bind=engine)

執(zhí)行上面的語句之后,User 這個 class 對應(yīng)的表就會被創(chuàng)建到數(shù)據(jù)庫中。

可以把上面這個語句添加到項目的啟動步驟中,因為這個操作會創(chuàng)建庫里沒有的表,已有的就不會重復執(zhí)行了。

2. 修改表結(jié)構(gòu)

SQLAlchemy 不支持通過函數(shù)的形式直接修改表結(jié)構(gòu),但是可以執(zhí)行原生的 SQL 來進行 ALTER TABLE 的操作。

或者通過下面的刪除表操作刪除,再進行 create_all() 操作,但是這樣的話,原表的數(shù)據(jù)就不存在了。

3. 刪除表

刪除表的操作與創(chuàng)建的方式類似,如下:

Base.metadata.drop_all(bind=engine)

這樣,所有繼承了 Base 基類的表都會被刪除

如果要執(zhí)行刪除單張表,可以使用 Table 的 drop() 函數(shù):

from sqlalchemy import Table, MetaData

meta_data = MetaData()
table_name = "users"
user_table = Table(table_name, meta_data, autoload_with=engine)
user_table.drop(bind=engine)

4、創(chuàng)建表數(shù)據(jù)

1. 創(chuàng)建單條數(shù)據(jù)

u = User(name="admin", email="120@qq.com")
db_session.add(u)
db_session.commit()

使用 add() 添加,然后進行 commit 操作

2. 創(chuàng)建多條數(shù)據(jù)

u1 = User(name="user_1", email="user1@qq.com")
u2 = User(name="user_2", email="user2@qq.com")
db_session.add_all([u1, u2])
db_session.commit()

批量創(chuàng)建使用 add_all() 函數(shù)。

5、查詢表數(shù)據(jù)

1. 根據(jù)主鍵 id 查詢數(shù)據(jù)

user = db_session.get(User, 1)

返回的 user 就是一個前面我們定義好的 User 對象

2. 條件查詢

條件查詢,可以有兩個操作,一個是 where(),一個是 filter(),這兩者在效果上是相同的,都是作用于條件查詢。

比如,我們要查詢 name 字段的值為 "admin" 以及 id 字段的值為 1 的數(shù)據(jù),且返回 id, name, email 字段,可以使用 query() 來進行字段限制,如下操作:

query = db_session.query(User.id, User.name, User.email).filter(User.name == "admin").filter(User.id == 1)

query = db_session.query(User.id, User.name, User.email).filter(User.name == "admin").where(User.id == 1)

query = db_session.query(User.id, User.name, User.email).where(User.name == "admin").filter(User.id == 1)

query = db_session.query(User.id, User.name, User.email).where(User.name == "admin").where(User.id == 1)

如果我們想要一條數(shù)據(jù),可以使用 first(),如果想要符合條件的全部數(shù)據(jù),可以使用 all()

query.first()
# (1, 'admin', '120@qq.com')

query.all()
# [(1, 'admin', '120@qq.com')]

除此之外,我們還可以將 db_session.query_property() 賦值給 Base.query,后面就可以直接通過 User 進行查詢操作

Base.query = db_session.query_property()

User.query.filter(User.name == "admin").filter(User.id == 1)

然后通過 first() 或者 all() 返回的就是定義的 User 的對象

6、更新表數(shù)據(jù)

對于我們獲取到的 ORM 模型實例,比如我們在前面通過主鍵 id 獲取到的數(shù)據(jù),或者在 db_session.query() 中不指定字段,直接指定模型獲取到的數(shù)據(jù),我們可以直接對其字段進行修改,然后 commit

user_1 = db_session.get(User, 1)
user_1.email = "999@qq.com"
db_session.add(user_1)

user_2 = db_session.query(User).filter(User.id == 2).first()
user_2.email = "888@qq.com"
db_session.add(user_2)

db_session.commit()

或者我們前面的 query 屬性的方式也可以:

User.query.filter(User.id == 1).update({"email": "19283@qq.com"})
db_session.commit()

7、刪除表數(shù)據(jù)

1. 單條記錄刪除

user = db_session.get(User, 2)
db_session.delete(user)
db_session.commit()

2. 根據(jù)條件批量刪除

User.query.filter(User.id == 3).delete()
db_session.commit()

以上就是詳解如何使用SQLAlchemy連接數(shù)據(jù)庫的詳細內(nèi)容,更多關(guān)于SQLAlchemy數(shù)據(jù)庫的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python 雙下劃線開頭的具體使用

    Python 雙下劃線開頭的具體使用

    本文主要介紹了Python 雙下劃線開頭的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-02-02
  • Python Paramiko模塊的使用實際案例

    Python Paramiko模塊的使用實際案例

    這篇文章主要介紹了Python Paramiko模塊的使用實際案例,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • python簡單貪吃蛇開發(fā)

    python簡單貪吃蛇開發(fā)

    這篇文章主要為大家詳細介紹了python簡單貪吃蛇開發(fā),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Python利用yield?form實現(xiàn)異步協(xié)程爬蟲

    Python利用yield?form實現(xiàn)異步協(xié)程爬蟲

    這篇文章主要為大家詳細介紹了Python如何利用yield?form實現(xiàn)異步協(xié)程爬蟲。其實這是很古老的用法了,現(xiàn)在大多用的aiohttp庫實現(xiàn),這篇記錄僅僅用做個人的協(xié)程底層實現(xiàn)的學習,希望對大家有所幫助
    2022-11-11
  • 教你用 Python 實現(xiàn)微信跳一跳(Mac+iOS版)

    教你用 Python 實現(xiàn)微信跳一跳(Mac+iOS版)

    這幾天看網(wǎng)上好多微信跳一跳破解了,不過都是安卓的,無奈蘋果不是開源也沒辦法。本文給大家分享用 Python 來玩微信跳一跳(Mac+iOS版),具體實現(xiàn)代碼大家參考下本文
    2018-01-01
  • 從源碼到Docker全方位解析Python項目打包完整指南

    從源碼到Docker全方位解析Python項目打包完整指南

    在實際開發(fā)中,將Python項目打包成可部署的格式是一個至關(guān)重要的環(huán)節(jié),本文將全面介紹Python項目的各種打包方式,從基礎(chǔ)的分發(fā)打包到現(xiàn)代化的Docker容器化部署,希望對大家有所幫助
    2025-11-11
  • Python列表推導式、字典推導式與集合推導式用法實例分析

    Python列表推導式、字典推導式與集合推導式用法實例分析

    這篇文章主要介紹了Python列表推導式、字典推導式與集合推導式用法,結(jié)合實例形式分析了Python三種推導式的概念、使用方法及相關(guān)注意事項,需要的朋友可以參考下
    2018-02-02
  • Python數(shù)據(jù)結(jié)構(gòu)鏈表操作從基礎(chǔ)到高級實例深究

    Python數(shù)據(jù)結(jié)構(gòu)鏈表操作從基礎(chǔ)到高級實例深究

    鏈表是一種基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),它由一系列節(jié)點組成,每個節(jié)點都包含數(shù)據(jù)和指向下一個節(jié)點的引用,在Python中,可以使用類來實現(xiàn)鏈表,本文將介紹如何實現(xiàn)鏈表,并提供一些豐富的示例代碼來幫助你更好地理解其原理和應(yīng)用
    2023-12-12
  • Django中常遇到的錯誤問題

    Django中常遇到的錯誤問題

    在Django開發(fā)中,設(shè)置DEBUG=False時需要配置ALLOWED_HOSTS以防止報錯,此外,如果django-admin.py命令找不到,需添加Django的安裝路徑到系統(tǒng)環(huán)境變量,此文還提供了一些常見Django錯誤的解決方法,如數(shù)據(jù)庫添加中文報錯、信號無法觸發(fā)等問題
    2024-09-09
  • 跟老齊學Python之正規(guī)地說一句話

    跟老齊學Python之正規(guī)地說一句話

    雖然在第一部分中,已經(jīng)零星涉及到語句問題,并且在不同場合也進行了一些應(yīng)用。畢竟不那么系統(tǒng)。本部分,就比較系統(tǒng)地介紹python中的語句。
    2014-09-09

最新評論

额尔古纳市| 临沭县| 黑龙江省| 长汀县| 唐山市| 从化市| 和林格尔县| 克拉玛依市| 黄梅县| 渭南市| 泗阳县| 田林县| 尚义县| 池州市| 社会| 锦州市| 绥宁县| 航空| 通州市| 宁德市| 寻乌县| 鹤山市| 临沧市| 玉山县| 新兴县| 仲巴县| 岫岩| 页游| 平利县| 措美县| 嘉峪关市| 依兰县| 晋中市| 成安县| 出国| 东乌| 云和县| 汾西县| 昭苏县| 金阳县| 永定县|