日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Flask-SQLAlchemy的使用(详解)

發布時間:2023/12/18 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Flask-SQLAlchemy的使用(详解) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SQLAlchemy映射構建

SQLAlchemy是Python編程語言下的一款開源軟件,提供了SQL工具包和ORM工具,使用MIT許可證發行。

SQLAlchemy采用簡單的Python語言,為了搞笑和高性能數據庫訪問設計,實現了完整的企業級持久模型。

SQLAlchemy首次發行于2006年2月,并迅速成為Python社區中最廣泛應用的ORM工具直以,不亞于Django的ORM框架

Flask-SQLAlchemy是在Flask框架上的一個擴展,對SQLAlchemy進行了封裝,目的簡化于在Flask中的SQLAlchemy的使用,提供了有用的默認值和額外的助手來完整簡單的日常任務。

一、Flask-SQLAlchemy的數據庫連接設置

在Flask中使用Flask-SQLAlchemy需要進行配置,主要配置有以下幾項:

  • SQLALCHEMY_DATABASE_URI 數據庫的連接信息

    • Postgres:

      postgresql://user:password@localhost/mydatabase
    • MySQL:

      mysql://user:password@localhost/mydatabase
    • Oracle:

      oracle://user:password@127.0.0.1:1521/sidname
    • SQLite (注意開頭的四個斜線):

      sqlite:absolute/path/to/foo.db
  • SQLALCHEMY_TRACK_MODIFICATIONS 在Flask中是否追蹤數據修改

  • SQLALCHEMY_ECHO 顯示生成的SQL語句,可用于調試

這些配置參數需要放在Flask的應用配置(app.config)中。

from flask import Flaskapp = Flask(__name__)class Config(object):# 表示連接數據庫的信息SQLALCHEMY_DATABASE_URI='mysql://root:mysql@localhost/abc'# 如果不設置,不會報錯,只會提示警告信息,如果要關閉警告信息,可以設置為True或False# True表示跟蹤數據庫信號變化,會影響計算機的性能,消耗內存,SQLALCHEMY_TRACK_MODIFICATION = False# 顯示生成的SQL語句,可用于調試 SQLALCHEMY_ECHO = Trueapp.config.from_object(Config)

其他配置信息自行百度。

二、模型類字段與選項

這個內容也自行百度吧!!。

三、使用

首先創建SQLAlchemy對象

  • 方式一:

    app = Flask(__name__)db = SQLAlchemy(app)
  • 方式二:

    db = SQLalchemy() db.init_app(app)

定義模型類

class User(db.Model):__table__name = 'user_basic'class STATUS:ENABLE = 1DISABLE = 0id = db.Column('user_id',db.Integer,primary_key=True,doc='用戶id')name = db.Column(db.String,doc='用戶昵稱')mobile = db.Column(db.String,doc='手機號')''''''

四、SQLAchemy操作

1.新增數據

user = User(name='wtt',mobile='13666666666') db.session.add(user) db.session.commit()

也可以使用批量添加對象語句

db.session.add([user,user1,user2]) db.session.commit()

2.查詢數據

all() ,查詢所有,返回列表

SQL: select user_id,name,mobile from user_basic; ORM: User.query.all()

first() ,查詢第一個,返回對象

SQL: select user_id,name,mobile from user_baisc limit 1; ORM: User.query.first()

get() , 根據主鍵ID獲取對象,若對象不存在會返回空

SQL: select user_id,name,mobile from user_basic where id = 1; ORM: User.query.get(1)

SQLAlchemy原生查詢

# 把模型類作為參數傳給數據庫會話對象 # session表述數據庫會話對象,封裝了對數據庫的基本操作,包括數據回滾、提交刪除等。 db.session.query(User).all() db.session.query(User).first() db.session.query(User).get(1)

filter_by ,過濾查詢

SQL: select user_id,name,mobile from user_basic where mobile='1366666666' ORM: # 直接使用filter_by返回的是查詢對象 User.query.filter_by(mobile='13666666666) # <flask_sqlalchemy.BaseQuery object at # 對查詢使用執行器;all表示列表;first表示一個 User.query.filter_by(mobile='13666666666').first()

filter, 過濾查詢

ORM: # 直接使用filter,返回的是查詢對象 User.query.filter(User.mobile=='13666666666') # <flask_sqlalchemy.BaseQuery object at User.query.filter(User.mobile=='13666666666').fitst()

filter_by和filter的區別:

  • 1.都是過濾查詢語句
  • 2.filter和filter_by不加參數,都是默認查詢所有
  • 3.參數不同,filter參數必須使用類名.屬性,filter_by參數是屬性就可以
  • 4.filter可以使用更多的運算符,filter_by只能使用賦值運算符;
  • 結論:filter使用的更多。

邏輯與、或、非 (與和非用到的非常少,因為默認就是and,而非的話則可以用!=或<>)

from sqlalchemy import and_,or_,not_ORM: User.query.filter(and_(User.name=='wtt'),User.id<=3).all() User.query.filter(or_(User.name.startswith('w'),User.id>=10)).all() User.query.filtet(not_(User.id==1))

offset和limit

  • 偏移和限制條目數,默認情況下,不區分前后順序;
  • MongoDB數據庫一旦使用管道:區分前后順序
# 從表中第二條記錄(包括第二條)開始往后顯示 User.query.offset(1).all() # 顯示表中第一條記錄 User.query.limit(1).all() # 顯示表中的3,4,5條數據 User.query.limit(3).offset(2).all()

order_by ,排序查詢 默認升序asc,降序是desc

User.query.order_by(User.id.desc()).all()

復合查詢

User.query.filter(User.name.startswith('w').order_by(User.id.desc())).offset(1).limit(1).all()

為了提高查詢效率,建議將這種復雜查詢拆分成幾條簡單的查詢

q = User.query.filter(User.name.startswith('w')) q = q.query.order_by(User.id.desc()) q = q.offset(1).limit(1) a = q.all()

優化查詢 load_only

# 默認是全字段查詢 User.query.filter(User.id>=30).all() # 優化查詢 ,查詢指定的字段 from sqlalchemy.orm import load_only User.query.options(load_only(User.id,User.name)).filter(User.id>=30).all()

聚合查詢 分組group_by

# 需求:用戶id為1的粉絲數? SQL: select user_id,count(targe_user_id) from user_realtion where id = 1; # 所有用戶的粉絲數,分組查詢 select user_id,count(target_user_id) from user_realtion group_by user_idORM: Relation.query.filter(Relaion.User_id==1).group_by(Relation.User_id).all()db.session,query(Relation.User_id,func.count(Relation.target_user_id)).group_by(Relation.user_id).all()

連表查詢 (關聯查詢)

  • 方式一:使用ForeignKey ,一方定義關系,另一方定義外鍵
class User(db.Model):# 一方定義關系,參數一為要關系的模型類,backref代表可以反向引用回來profile = db.relationship('UserProfile',uselist=False,backref='p')follow = db.relationship('Relation',userlist=False,backref='f') class Userprofile(db.model):```# 另外一方定義外鍵,不是數據庫中的外鍵,僅僅是關聯查詢時的屬性,在數據庫中沒有實體# 如果通過遷移的形式創建表,外鍵有實體;id = db.Column('user_id',db.Integet,db.foreign('user_basc.user_id'),doc='用戶ID') class Relation(db.mobile):user_id = db.Column(db.Integet,db.foreign('user_basic.user_id'),doc='用戶ID')

測試

# 測試 正向查詢 從User到Relationuser = User.query.filter(User.name=='wtt').first()# 使用關系選項,查詢該用戶關注了那些人user.follow# 反向查詢 ,從Relation到Userrel = Relation.query.get(1)# 使用反向引用 查詢該用戶id是那個用戶rel.f
  • 方式二:使用primaryjoin,主要連接條件
class User(db.Model):profile = db.relationship('UserProfile',primaryjoin('User.id==foreign(Relation.id)'))

測試 查詢該用戶的基本信息

user = User.query.get(10) user.profile

連表查詢優化,因為連表查詢也是全字段掃描,所以需要優化

# 需求:根據手機號查詢用戶的粉絲數 SQL: select user_relation.user_id,count(Relation.target_user_id) from Relation join User on User.id=Relation.user_id where mobil='13666666666'ORM:指定字段、連表查詢、計數 from sqlalchemy.orm import load_only,contains_eageruser = User.query.join(User.follow).options(load_only(User.id,User.name).contaings_eager(User.follow).load_only(Relation.user_id,Relation.target_user_id)).filter(User.mobile=='13666666666').all() user[0].follow

3.更新數據

  • 方式一:

    user = User.query.get(1) user.name='wttaa' db.session.add(user) db.session.commit()
  • 方式二:

    User.query.filter(User.id==1).update({'name'=='en'}) db.session.commit()

4.刪除數據

  • 方式一:

    user = User.query.get(1) db.session.delete(user) db.session.commit()
  • 方式二:

    User.query.filter(User.id==1).delete() db.session.commit()

5.事務

environ = {'wsgi.version':(1,0), 'wsgi.input': '', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/', 'SERVER_NAME': 'flask python', 'wsgi.url_scheme': 'http', 'SERVER_PORT': '80'}# 使用請求上下文環境 with app.request_context(environ):try:user = User(mobile='13666666666',name='wtt')db.session.add(user)db.session.flush() # 將數據刷新到數據庫中profile = UserProfiel(id=user.id)db.session.add(profie)db.session.commit()except:db.session.rollback()

總結

以上是生活随笔為你收集整理的Flask-SQLAlchemy的使用(详解)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。