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

全國(guó)咨詢/投訴熱線:400-618-4000

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

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

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

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

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

①安裝擴(kuò)展包及導(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ù)庫(kù)的設(shè)置
#數(shù)據(jù)庫(kù)信息設(shè)置
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/數(shù)據(jù)庫(kù)名'
# 動(dòng)態(tài)追蹤修改設(shè)置,如未設(shè)置只會(huì)提示警告,極大影響mysql性能app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
③創(chuàng)建連接數(shù)據(jù)庫(kù)的對(duì)象
db = SQLAlchemy(app)
④定義模型類,繼承db.Model
定義數(shù)據(jù)庫(kù)的表名: __tablename__   
設(shè)置字段: 字段=db.Column(db.字段類型,字段選項(xiàng))   
     例如: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')
給該模型類添加一個(gè)屬性,第一個(gè)參數(shù)為多類類名,通過這個(gè)屬性可以查詢一對(duì)多所有對(duì)象
第二個(gè)參數(shù)backref =’該類類名小寫‘,是反向給多類申明一個(gè)新屬性
第三個(gè)參數(shù)指定是lazy屬性,即何時(shí)加載數(shù)據(jù),dynamic指的是在訪問屬性的時(shí)候,并沒有在內(nèi)存中加載數(shù)據(jù),而是返回一個(gè)query對(duì)象, 需要執(zhí)行相應(yīng)方法才可以獲取對(duì)象,比如.all()
⑤無(wú)遷移式的建表和刪表
db.drop_all() 刪除該數(shù)據(jù)庫(kù)所有的表             db.create_all() 在該數(shù)據(jù)庫(kù)下創(chuàng)建所有模型類映射的表

增刪改查
增:①創(chuàng)建對(duì)象:  b =Book(name='圖書')
       ②把數(shù)據(jù)添加到用戶會(huì)話:db.session.add(b)      
    如果多個(gè)對(duì)象,使用db.session.add_all([b1,b2,b3])
③提交用戶會(huì)話到數(shù)據(jù)庫(kù):  db.session.commit()
刪:第一種方式:
①查出該對(duì)象:     b=Book.query.get(1)
②從用戶會(huì)話刪除該對(duì)對(duì)象:    db.session.delete(b)
③提交用戶會(huì)話:  db.session.commit() 
第二種方式:
①查出對(duì)象直接刪除:  Book.query.get(1).delete()
②提交用戶會(huì)話:  db.session.commit() 
改:①查出該對(duì)象:      b=Book.query.get(1)
②修改對(duì)象屬性:  b.name='小說'
③提交用戶會(huì)話:  db.session.commit() 
查:①無(wú)條件查詢:Book.query.查詢執(zhí)行器
②條件查詢:Book.query.過濾器.查詢執(zhí)行器
常用過濾器如下:
過濾器 說明 示例
filter(條件) 返回符合該條件的查詢集,BaseQuery對(duì)象 Book.query.filter(Book.id==1)
filter_by() 返回符合該等值條件的查詢集 Book.query.filter_by(id=1)
limit 使用指定的值限定原查詢返回的結(jié)果
offset() 偏移原查詢返回的結(jié)果,返回一個(gè)新查詢集
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() 返回查詢的第一個(gè)結(jié)果,如果未查到,返回None Book.query.filter(Book.id==1).first()
first_or_404() 返回查詢的第一個(gè)結(jié)果,如果未查到,返回404
get() 返回指定主鍵對(duì)應(yīng)的行,如不存在,返回None Book.query.get(1)
get_or_404() 返回指定主鍵對(duì)應(yīng)的行,如不存在,返回404
count() 返回查詢結(jié)果的數(shù)量 Book.query.count()
paginate() 返回一個(gè)Paginate對(duì)象,它包含指定范圍內(nèi)的結(jié)果,參數(shù)一:第幾頁(yè),參數(shù)二:每頁(yè)個(gè)數(shù),參數(shù)3:如果沒有該頁(yè)數(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()

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


flask數(shù)據(jù)庫(kù)遷移
D:在數(shù)據(jù)庫(kù)中建立模型類映射的數(shù)據(jù)庫(kù)表,如果需要修改數(shù)據(jù)庫(kù)模型,還要在修改之后更新數(shù)據(jù)庫(kù),最好的解決的方法使用數(shù)據(jù)庫(kù)遷移框架Flask-Migrate
E:建立相關(guān)數(shù)據(jù)庫(kù)表,而且追蹤數(shù)據(jù)庫(kù)模式的變化,然后把變動(dòng)應(yīng)用到數(shù)據(jù)庫(kù)中,還可以回退版本。
U:遷移步驟:
①安裝擴(kuò)展包:遷移擴(kuò)展包: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ù)庫(kù):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
回退一個(gè)遷移版本 python xxx.py db downgrade
查看遷移歷史記錄 python xxx.py db history
向上遷移到指定版本 python xxx.py db upgrade 版本號(hào)
向下遷移到指定版本 python xxx.py db downgrade 版本號(hào)
查看當(dāng)前遷移版本 python xxx.py db current



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

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

0 分享到:
和我們?cè)诰€交談!