教育行業(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 二進(jìn)制文件

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

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

①安裝擴展包及導(dǎo)包
安裝flask-sqlalchemy:pip install flask-sqlalchemy
如果連接的是mysql數(shù)據(jù),需安裝mysqldb:pip install flask-sqlalchemy
導(dǎo)包:from flask_sqlalchemy import SQLAlchemy
②配置相關(guān)數(shù)據(jù)庫的設(shè)置
#數(shù)據(jù)庫信息設(shè)置
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/數(shù)據(jù)庫名'
# 動態(tài)追蹤修改設(shè)置,如未設(shè)置只會提示警告,極大影響mysql性能app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
③創(chuàng)建連接數(shù)據(jù)庫的對象
db = SQLAlchemy(app)
④定義模型類,繼承db.Model
定義數(shù)據(jù)庫的表名: __tablename__   
設(shè)置字段: 字段=db.Column(db.字段類型,字段選項)   
     例如:id = db.Column(db.Integer, primary_key=True)
      name = db.Column(db.String(64), unique=True)
設(shè)置關(guān)聯(lián)屬性: books = db.relationship('Book', backref='author', lazy='dynamic')
給該模型類添加一個屬性,第一個參數(shù)為多類類名,通過這個屬性可以查詢一對多所有對象
第二個參數(shù)backref =’該類類名小寫‘,是反向給多類申明一個新屬性
第三個參數(shù)指定是lazy屬性,即何時加載數(shù)據(jù),dynamic指的是在訪問屬性的時候,并沒有在內(nèi)存中加載數(shù)據(jù),而是返回一個query對象, 需要執(zhí)行相應(yīng)方法才可以獲取對象,比如.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 使用指定的值限定原查詢返回的結(jié)果
offset() 偏移原查詢返回的結(jié)果,返回一個新查詢集
order_by() 根據(jù)字段進(jìn)行排序,默認(rèn)是正序,返回新查詢集,desc可以反序 Book.query.order_by(Book.id)
Book.query.order_by(Book.id.desc)
group_by() 根據(jù)字段進(jìn)行分組,返回新查詢集合

常用查詢執(zhí)行器如下:
方法 說明 示例
all() 以列表形式返回查詢的所有結(jié)果 Book.query.filter(Book.id==1).all()
first() 返回查詢的第一個結(jié)果,如果未查到,返回None Book.query.filter(Book.id==1).first()
first_or_404() 返回查詢的第一個結(jié)果,如果未查到,返回404
get() 返回指定主鍵對應(yīng)的行,如不存在,返回None Book.query.get(1)
get_or_404() 返回指定主鍵對應(yīng)的行,如不存在,返回404
count() 返回查詢結(jié)果的數(shù)量 Book.query.count()
paginate() 返回一個Paginate對象,它包含指定范圍內(nèi)的結(jié)果,參數(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()

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


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



作者:傳智播客人工智能+Python培訓(xùn)學(xué)院

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

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