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數據庫一旦使用管道:區分前后順序
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 ,一方定義關系,另一方定義外鍵
測試
# 測試 正向查詢 從User到Relationuser = User.query.filter(User.name=='wtt').first()# 使用關系選項,查詢該用戶關注了那些人user.follow# 反向查詢 ,從Relation到Userrel = Relation.query.get(1)# 使用反向引用 查詢該用戶id是那個用戶rel.f- 方式二:使用primaryjoin,主要連接條件
測試 查詢該用戶的基本信息
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].follow3.更新數據
-
方式一:
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的使用(详解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle开启em服务
- 下一篇: mysql局域网访问6_mysql局域网