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

Python??Flask框架操作數(shù)據(jù)庫的方法

 更新時間:2024年02月01日 14:37:50   作者:程序猿知秋  
Flask中最方便用的數(shù)據(jù)庫框架是flask_sqlalchamy,是對?SQLAlchamy?在?Flask?中的擴(kuò)展,它主要在于簡化Flask?中?sqlalchamy的使用,本篇文章給大家介紹Python??Flask的數(shù)據(jù)庫操作使用方法,感興趣的朋友一起看看吧

簡介

SQLAlchamy 是 Python 中一個通過 ORM 操作數(shù)據(jù)庫的框架

SQLAlchemy(對象關(guān)系映射器)提供了一種方法,用于將用戶定義的Python類與數(shù)據(jù)庫表相關(guān)聯(lián),并將這些類(對象)的實(shí)例與其對應(yīng)表中的行相關(guān)聯(lián)。

簡單理解: 創(chuàng)建一個類,一個類對應(yīng)了一個數(shù)據(jù)庫中的一張表,類的屬性名對應(yīng)了表中的字段名,這個類稱為映射類

SQLAlchemy本身無法操作數(shù)據(jù)庫,其必須使用 pymsql 等第三方插件,從而實(shí)現(xiàn)對數(shù)據(jù)庫的操作,如:mysql數(shù)據(jù)庫

mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]

使用

flask_sqlalchamy

Flask 中最方便用的數(shù)據(jù)庫框架是 flask_sqlalchamy,是對 SQLAlchamy 在 Flask 中的擴(kuò)展,它主要在于簡化Flask 中 sqlalchamy的使用

安裝

pip install flask_sqlalchemy

初始化

為了方便管理數(shù)據(jù)庫相關(guān)的配置項,flask_sqlalchamy 中采用app.config進(jìn)行相關(guān)屬性配置

配置變量的名稱必須使用大寫,寫入配置的語句一般會放到擴(kuò)展類實(shí)例化語句之前

配置項說明
SQLALCHEMY_DATABASE_URI數(shù)據(jù)庫的鏈接地址
SQLALCHEMY_BINDS訪問多個數(shù)據(jù)庫時,用于設(shè)置數(shù)據(jù)庫鏈接池地址
SQLALCHEMY_ECHO是否打印底層執(zhí)行的SQL語句
SQLALCHEMY_RECORD_QUERIES是否記錄執(zhí)行的查詢語句,用于慢查詢分析
SQLALCHEMY_TRACK_MODIFICATIONS是否追蹤數(shù)據(jù)庫變化
SQLALCHEMY_ENGINE_OPTIONS設(shè)置針對 sqlalchemy本體的配置項

設(shè)置數(shù)據(jù)庫鏈接

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# 設(shè)置數(shù)據(jù)庫鏈接地址
app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:123456@127.0.0.1:3306/test'
# 設(shè)置顯示底層執(zhí)行的sql語句
app.config['SQLALCHEMY_ECHO'] = True
# 初始化組件對象,關(guān)聯(lián)flask應(yīng)用
db = SQLAlchemy(app)

構(gòu)建模型

模型簡單來說就是數(shù)據(jù)庫中的一張表定義,需要有名稱,字段,在 Python 中用一個類來表示,由于需要和數(shù)據(jù)庫的表對應(yīng),模型必須繼承自 SQLAlchamy 的 Model 類

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import datetime
app = Flask(__name__)
# 設(shè)置數(shù)據(jù)庫鏈接地址
app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:123456@127.0.0.1:3306/test'
# 設(shè)置顯示底層執(zhí)行的sql語句
app.config['SQLALCHEMY_ECHO'] = True
# 初始化組件對象,關(guān)聯(lián)flask應(yīng)用
db = SQLAlchemy(app)
# 構(gòu)建模型類
class User(db.Model):
    # 設(shè)置表名,表名默認(rèn)為類名小寫
    __tablename__ = 'user'
    id = db.Column(db.Integer,primary_key=True)   # 設(shè)置主鍵,默認(rèn)自增
    name = db.Column(db.String(20))
    age = db.Column(db.Integer,default=20)  #設(shè)置默認(rèn)值
    createtime=db.Column(db.DateTime())
    def __repr__(self):  # 自定義 交互模式 & print() 的對象打印
      return "(%s, %s, %s, %s)" % (self.id, self.name, self.age,self.createtime)
if __name__ == '__main__':
    app.run(debug=True)

__repr__ 方法定義了一個對象的比較易讀的顯式方式

常用字段類

字段類型說明
db.Integer整數(shù)
db.String(size)字符串 size 為字符串長度
db.DateTime日期時間
db.Date日期
db.Text長文本,可以存放 CLOB (二進(jìn)制數(shù)據(jù))
db.Float浮點(diǎn)數(shù)字
db.Boolean布爾值

常用字段選項

字段類型說明
primary_key設(shè)置表的主鍵,默認(rèn)自增
unique設(shè)置唯一索引
nullable非空約束
default設(shè)置默認(rèn)值
index創(chuàng)建索引

創(chuàng)建庫表

@app.route("/initDB")
def init_db():
    # 刪除所有繼承睡在db.Model的表
    db.drop_all()
    # 創(chuàng)建所有繼承自 db.Model的表
    db.create_all()
    return "initdb"

注:db.drop_all() 和 db.create_all() 放在 main中不啟作用,所以單獨(dú)寫一個方法進(jìn)行初始化。

一般庫表的創(chuàng)建與應(yīng)用都是分開的,單獨(dú)創(chuàng)建庫表,沒必要將此類語句寫在應(yīng)用中

數(shù)據(jù)操作

增加數(shù)據(jù)

@app.route("/add")
def add():
    # 添加數(shù)據(jù)
    user1 = User(name='zhao', age=33, createtime=datetime.datetime.now())
    # 將模型添加到會話中
    db.session.add(user1)
    # 添加多條記錄
    # db.session.add_all([user1,user2,user3])
    # 提交會話, sqlalchemy會自動創(chuàng)建隱式事務(wù),失敗會自動回滾
    db.session.commit()
    return "add" 

注:

  • sqlalchemy會自動創(chuàng)建事務(wù),并將數(shù)據(jù)的操作都包含在一個事務(wù)中,提交會話就會提交事務(wù)
  • session 是一個與數(shù)據(jù)庫通信的會話,是 SQLAlchamy 框架與數(shù)據(jù)庫交互的代理
  • 可以調(diào)用 session.rollback() 回滾掉未提交的變化

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

簡單查詢

@app.route("/query")
def query():
    # 查詢所有用戶數(shù)據(jù), 返回User列表,
    data = User.query.all()
    for item in data:
        print(item.name,item.age)
    # 查詢有多少個用戶,返回結(jié)果數(shù)
    data = User.query.count()
    print(data)
    # 查詢第1個用戶 , 返回User對象
    data = User.query.first()
    print(data)
    # 查詢id為4的用戶, 返回User對象
    data = User.query.get(4)
    print(data)
    return "query"

條件過濾查詢

@app.route("/query2")
def query2():
    # 查詢 name 等于 zhao 的記錄集中第一條記錄
    data = User.query.filter(User.name =='zhao').first()
    # 查詢 name 不等于 zhao 的所有記錄
    data = User.query.filter(User.name != 'zhao').all()
    # 前模糊查詢
    data = User.query.filter(User.name.like("%zhao")).all()
    print(data)
    # 查詢名字以 zhao 開頭的用戶
    data = User.query.filter(User.name.startswith('zhao')).all()
    # 查詢名字是 zhao,并且年齡是22歲的用戶
    from sqlalchemy import and_
    data = User.query.filter(and_(User.name=='zhao', User.age==22)).all()
    # 查詢名字是 zhao或者h(yuǎn)ong的用戶
    from sqlalchemy import or_
    data = User.query.filter(or_(User.name=='zhao', User.name=='hong')).all()
    # 查詢id為[1, 2, 3]的用戶
    data = User.query.filter(User.id.in_([1, 2, 3])).all()
    # 分頁查詢
    # 所有用戶先按年齡從小到大, 再按id從大到小排序, 取前5個
    data = User.query.order_by(User.age, User.id.desc()).limit(5).all()
    # 分頁查詢, 每頁1個, 查詢第2頁的數(shù)據(jù)  paginate(頁碼, 每頁條數(shù))
    pn = User.query.paginate(page=2, per_page=1)
    print("總頁數(shù):"+str(pn.pages)+" 當(dāng)前頁碼:"+str(pn.page)+"當(dāng)前頁的數(shù)據(jù):"+ str(pn.items)+" 總條數(shù):"+str(pn.total))
    # 分組查詢
    # 查詢每個年齡的人數(shù)    select age, count(name) from t_user group by age  分組聚合
    from sqlalchemy import func
    data = db.session.query(User.age, func.count(User.id).label("count")).group_by(User.age).all()
    return "query2"

常用查詢方法

方法名稱說明
all()返回所有查詢記錄的列表
first()返回查詢的第一條記錄,如果未找到,則返回None
get(id)傳入主鍵值作為參數(shù),返回指定主鍵值的記錄,如果未找到,則返回None
count()返回查詢結(jié)果的數(shù)量
paginate()返回一個Pagination對象,可以對記錄進(jìn)行分頁處理

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

@app.route("/update")
def update():
    # 更新用戶年齡為44,條件是:用戶名=zhao
    # 相當(dāng)于:update user set age = 44 where name = 'zhao';
    User.query.filter(User.name == 'zhao').update({'age': 44})
    # 提交會話
    db.session.commit()
    return "update"

刪除數(shù)據(jù)

@app.route("/del")
def delete():
    # 刪除id=1的用戶
    # 相當(dāng)于:delete from user where id=1
    User.query.filter(User.id == 1).delete()
    # 提交會話
    db.session.commit()
    return "del"

多表關(guān)聯(lián)查詢

連接查詢

開發(fā)中有 聯(lián)表查詢需求 時, 一般會使用 join連接查詢

db.session.query(主表模型字段1, 主表模型字段2, 從表模型字段1, xx.. ).join(從表模型類, 主表模型類.主鍵 == 從表模型類.外鍵)

示例

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import datetime
app = Flask(__name__)
# 設(shè)置數(shù)據(jù)庫鏈接地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@127.0.0.1:3306/test'
# 設(shè)置顯示底層執(zhí)行的sql語句
app.config['SQLALCHEMY_ECHO'] = True
# 初始化組件對象,關(guān)聯(lián)flask應(yīng)用
db = SQLAlchemy(app)
# 構(gòu)建模型類
class User(db.Model):
    # 設(shè)置表名,表名默認(rèn)為類名小寫
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True)  # 設(shè)置主鍵,默認(rèn)自增
    name = db.Column(db.String(20))
    age = db.Column(db.Integer, default=20)  # 設(shè)置默認(rèn)值
    createtime = db.Column(db.DateTime())
    def __repr__(self):  # 自定義 交互模式 & print() 的對象打印
        return "(%s, %s, %s, %s)" % (self.id, self.name, self.age, self.createtime)
class Address(db.Model):
    __tablename__ = 'address'
    id = db.Column(db.Integer, primary_key=True)
    detail = db.Column(db.String(20))
    user_id = db.Column(db.Integer)  # 定義外鍵
if __name__ == '__main__':
    app.run(debug=True)
@app.route("/")
def index():
    return "index"
@app.route("/query")
def query():
    """ 查詢多表數(shù)據(jù)  需求: 查詢姓名為"hong" 的用戶id和地址信息"""
    # sqlalchemy的join查詢
    # 相當(dāng)于:SELECT user.id AS user_id, address.detail AS address_detail
    #           FROM user INNER JOIN address ON user.id = address.user_id
    data = db.session.query(User.id, Address.detail).join(Address, User.id == Address.user_id).filter(
        User.name == 'hong').all()
    for item in data:
        print(item.detail, item.id)
    return "query"

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

相關(guān)文章

  • 淺析Python中g(shù)etattr和getattribute的調(diào)用

    淺析Python中g(shù)etattr和getattribute的調(diào)用

    在Python中,getattr和getattribute是兩個用于屬性訪問的重要函數(shù),它們可以在運(yùn)行時動態(tài)地獲取對象的屬性或自定義屬性訪問行為,下面我們就來學(xué)習(xí)一下它們的具體用法吧
    2023-11-11
  • Python爬蟲使用實(shí)例wallpaper問題記錄

    Python爬蟲使用實(shí)例wallpaper問題記錄

    本文介紹解決中文亂碼的方法,以及Python爬蟲處理數(shù)據(jù)、圖片URL的技巧,包括使用正則表達(dá)式處理字符串、URL替換等,還涉及單線程與多線程的應(yīng)用場景,如電腦壁紙和手機(jī)壁紙爬取,適合進(jìn)行Web數(shù)據(jù)抓取和處理的開發(fā)者參考
    2024-09-09
  • 詳解python讀寫json文件

    詳解python讀寫json文件

    這篇文章主要為大家介紹了python讀寫json文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • python中實(shí)現(xiàn)數(shù)組和列表讀取一列的方法

    python中實(shí)現(xiàn)數(shù)組和列表讀取一列的方法

    下面小編就為大家分享一篇python中實(shí)現(xiàn)數(shù)組和列表讀取一列的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Pandas保存csv數(shù)據(jù)的三種方式詳解

    Pandas保存csv數(shù)據(jù)的三種方式詳解

    CSV文件以純文本形式存儲表格數(shù)據(jù)(數(shù)字和文本),是一種通用的、相對簡單的文件格式,被用戶、商業(yè)和科學(xué)廣泛應(yīng)用。本文介紹了三種Pandas保存CSV文件數(shù)據(jù)的方法,需要的可以參考一下
    2022-03-03
  • Python輕松實(shí)現(xiàn)將圖片轉(zhuǎn)換為PDF并合并

    Python輕松實(shí)現(xiàn)將圖片轉(zhuǎn)換為PDF并合并

    在日常辦公或文檔處理中,我們經(jīng)常需要將多張圖片合并成一個 PDF 文件,本文將介紹如何使用 Python 和 Spire.PDF for Python 庫,輕松實(shí)現(xiàn)圖片到 PDF 的轉(zhuǎn)換與合并功能,感興趣的可以了解下
    2026-04-04
  • python 將對象設(shè)置為可迭代的兩種實(shí)現(xiàn)方法

    python 將對象設(shè)置為可迭代的兩種實(shí)現(xiàn)方法

    今天小編就為大家分享一篇python 將對象設(shè)置為可迭代的兩種實(shí)現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python實(shí)現(xiàn)的北京積分落戶數(shù)據(jù)分析示例

    Python實(shí)現(xiàn)的北京積分落戶數(shù)據(jù)分析示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的北京積分落戶數(shù)據(jù)分析,結(jié)合實(shí)例形式分析了Python針對北京積分落戶數(shù)據(jù)的分析、運(yùn)算、展示等相關(guān)操作技巧,需要的朋友可以參考下
    2020-03-03
  • Python實(shí)現(xiàn)連接dr校園網(wǎng)示例詳解

    Python實(shí)現(xiàn)連接dr校園網(wǎng)示例詳解

    在校園里認(rèn)證上網(wǎng)很麻煩需要web輸入賬號密碼有時還會忘記web地址,所以為了解決這一問題,本文將為大家介紹通過Python實(shí)現(xiàn)校園網(wǎng)的連接,快來跟隨小編一起學(xué)習(xí)吧
    2021-11-11
  • 利用Python實(shí)現(xiàn)批量打包程序的工具

    利用Python實(shí)現(xiàn)批量打包程序的工具

    auto-py-to-exe與pyinstaller都無法直接一次性打包多個程序,想打包多個程序需要重新操作一遍。所以本文將用Python實(shí)現(xiàn)批量打包程序的工具,感興趣的可以了解一下
    2022-07-07

最新評論

沙河市| 鄂州市| 庆阳市| 朝阳县| 乌海市| 水富县| 陇南市| 新蔡县| 庆安县| 新化县| 同德县| 邹城市| 于都县| 永福县| 响水县| 大理市| 闻喜县| 翁牛特旗| 会昌县| 望城县| 麻城市| 大邑县| 保靖县| 洪湖市| 洛宁县| 女性| 黄梅县| 垣曲县| 来凤县| 南城县| 平泉县| 兴山县| 班戈县| 金阳县| 安陆市| 沙河市| 封开县| 孟连| 江津市| 旬阳县| 赣州市|