教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

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

更新時間:2018年12月19日14時52分 來源:傳智播客 瀏覽次數(shù):

Flask數(shù)據(jù)庫
D:使用擴展包flask-sqlalchemy來操作數(shù)據(jù)庫(增刪改查)
E:通過 Python 對象來操作數(shù)據(jù)庫,在舍棄一些性能開銷的同時,換來的是開發(fā)效率的較大提升
U:常用的SQLAlchemy字段類型
類型名 python中類型 說明
Integer int 普通整數(shù),一般是32位
SmallInteger int 取值范圍小的整數(shù),一般是16位
BigInteger int或long 不限制精度的整數(shù)
Float float 浮點數(shù)
Numeric decimal.Decimal 普通整數(shù),一般是32位
String str 變長字符串
Text str 變長字符串,對較長或不限長度的字符串做了優(yōu)化
Unicode unicode 變長Unicode字符串
UnicodeText unicode 變長Unicode字符串,對較長或不限長度的字符串做了優(yōu)化
Boolean bool 布爾值
Date datetime.date 時間
Time datetime.datetime 日期和時間
LargeBinary str 二進制文件

常用的SQLAlchemy列選項
選項名 說明
primary_key 如果為True,代表表的主鍵
unique 如果為True,代表這列不允許出現(xiàn)重復的值
index 如果為True,為這列創(chuàng)建索引,提高查詢效率
nullable 如果為True,允許有空值,如果為False,不允許有空值
default 為這列定義默認值

常用的SQLAlchemy關系選項
選項名 說明
backref 在關系的另一模型中添加反向引用
primary join 明確指定兩個模型之間使用的聯(lián)結條件
uselist 如果為False,不使用列表,而使用標量值
order_by 指定關系中記錄的排序方式
secondary 指定多對多中記錄的排序方式
secondary join 在SQLAlchemy中無法自行決定時,指定多對多關系中的二級聯(lián)結條件

①安裝擴展包及導包
安裝flask-sqlalchemy:pip install flask-sqlalchemy
如果連接的是mysql數(shù)據(jù),需安裝mysqldb:pip install flask-sqlalchemy
導包:from flask_sqlalchemy import SQLAlchemy
②配置相關數(shù)據(jù)庫的設置
#數(shù)據(jù)庫信息設置
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/數(shù)據(jù)庫名'
# 動態(tài)追蹤修改設置,如未設置只會提示警告,極大影響mysql性能app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
③創(chuàng)建連接數(shù)據(jù)庫的對象
db = SQLAlchemy(app)
④定義模型類,繼承db.Model
定義數(shù)據(jù)庫的表名: __tablename__   
設置字段: 字段=db.Column(db.字段類型,字段選項)   
     例如:id = db.Column(db.Integer, primary_key=True)
      name = db.Column(db.String(64), unique=True)
設置關聯(lián)屬性: books = db.relationship('Book', backref='author', lazy='dynamic')
給該模型類添加一個屬性,第一個參數(shù)為多類類名,通過這個屬性可以查詢一對多所有對象
第二個參數(shù)backref =’該類類名小寫‘,是反向給多類申明一個新屬性
第三個參數(shù)指定是lazy屬性,即何時加載數(shù)據(jù),dynamic指的是在訪問屬性的時候,并沒有在內(nèi)存中加載數(shù)據(jù),而是返回一個query對象, 需要執(zhí)行相應方法才可以獲取對象,比如.all()
⑤無遷移式的建表和刪表
db.drop_all() 刪除該數(shù)據(jù)庫所有的表             db.create_all() 在該數(shù)據(jù)庫下創(chuàng)建所有模型類映射的表

增刪改查
增:①創(chuàng)建對象:  b =Book(name='圖書')
       ②把數(shù)據(jù)添加到用戶會話:db.session.add(b)      
    如果多個對象,使用db.session.add_all([b1,b2,b3])
③提交用戶會話到數(shù)據(jù)庫:  db.session.commit()
刪:第一種方式:
①查出該對象:     b=Book.query.get(1)
②從用戶會話刪除該對對象:    db.session.delete(b)
③提交用戶會話:  db.session.commit() 
第二種方式:
①查出對象直接刪除:  Book.query.get(1).delete()
②提交用戶會話:  db.session.commit() 
改:①查出該對象:      b=Book.query.get(1)
②修改對象屬性:  b.name='小說'
③提交用戶會話:  db.session.commit() 
查:①無條件查詢:Book.query.查詢執(zhí)行器
②條件查詢:Book.query.過濾器.查詢執(zhí)行器
常用過濾器如下:
過濾器 說明 示例
filter(條件) 返回符合該條件的查詢集,BaseQuery對象 Book.query.filter(Book.id==1)
filter_by() 返回符合該等值條件的查詢集 Book.query.filter_by(id=1)
limit 使用指定的值限定原查詢返回的結果
offset() 偏移原查詢返回的結果,返回一個新查詢集
order_by() 根據(jù)字段進行排序,默認是正序,返回新查詢集,desc可以反序 Book.query.order_by(Book.id)
Book.query.order_by(Book.id.desc)
group_by() 根據(jù)字段進行分組,返回新查詢集合

常用查詢執(zhí)行器如下:
方法 說明 示例
all() 以列表形式返回查詢的所有結果 Book.query.filter(Book.id==1).all()
first() 返回查詢的第一個結果,如果未查到,返回None Book.query.filter(Book.id==1).first()
first_or_404() 返回查詢的第一個結果,如果未查到,返回404
get() 返回指定主鍵對應的行,如不存在,返回None Book.query.get(1)
get_or_404() 返回指定主鍵對應的行,如不存在,返回404
count() 返回查詢結果的數(shù)量 Book.query.count()
paginate() 返回一個Paginate對象,它包含指定范圍內(nèi)的結果,參數(shù)一:第幾頁,參數(shù)二:每頁個數(shù),參數(shù)3:如果沒有該頁數(shù)返回False Book.query.paginate(2,3,False)


邏輯非,邏輯與,邏輯或
from sqlalchemy import not_,and_,or_
示例:User.query.filter(not_(User.name=='chen')).all()
              User.query.filter(and_(User.name!='wang',User.email.endswith('163.com'))).all()

一對多,多對一關聯(lián)查詢
一對多:①先查詢出一類對象,例如author=Author.query.get(1)
②根據(jù)我們設置的relationship屬性獲取這一類對象下的全部多類對象:
books=author.books                  (即該作者下全部書籍)
多對一:①查詢出多類對象,例如book=Book.query.get(2)
②根據(jù)我們設置的backref反向設置的屬性獲取該多類對象對應的一類對象:
author =book.author                 (即這本書所屬的作者)


flask數(shù)據(jù)庫遷移
D:在數(shù)據(jù)庫中建立模型類映射的數(shù)據(jù)庫表,如果需要修改數(shù)據(jù)庫模型,還要在修改之后更新數(shù)據(jù)庫,最好的解決的方法使用數(shù)據(jù)庫遷移框架Flask-Migrate
E:建立相關數(shù)據(jù)庫表,而且追蹤數(shù)據(jù)庫模式的變化,然后把變動應用到數(shù)據(jù)庫中,還可以回退版本。
U:遷移步驟:
①安裝擴展包:遷移擴展包:pip install flask-migrate,腳本管理器包:pip install flask-script
②導包:from flask_migrate import Migrate,MigrateCommand                      from flask_script import Shell,Manager
③創(chuàng)建腳本管理器:manager= Manager(app)
④遷移關聯(lián)應用和數(shù)據(jù)庫:Migrate(app,db)
⑤添加遷移命令道腳本管理器:manager.add_command('db',MigrateCommand)
⑥使用腳本命令在命令行進行遷移操作:
創(chuàng)建遷移文件夾 python xxx.py db init
生成當前版本遷移文件 python xxx.py db migrate -m '版本說明'
執(zhí)行當前本遷移文件 python xxx.py db upgrade
回退一個遷移版本 python xxx.py db downgrade
查看遷移歷史記錄 python xxx.py db history
向上遷移到指定版本 python xxx.py db upgrade 版本號
向下遷移到指定版本 python xxx.py db downgrade 版本號
查看當前遷移版本 python xxx.py db current



作者:傳智播客人工智能+Python培訓學院

首發(fā):http://python.itcast.cn

0 分享到:
和我們在線交談!