1. 程式人生 > >python-flaskweb學習筆記二

python-flaskweb學習筆記二

在 ORM 中,模型一般是一個 Python 類,類中的屬性對應資料庫表中的列。

最常用的SQLAlchemy列型別

型別名 Python型別

說  明

Integer

 

int

普通整數,一般是 32 位

SmallInteger

 

int

取值範圍小的整數,一般是 16 位

BigInteger  

int 或 long 不限制精度的整數

Float

 

float

 浮點數

Numeric

 

decimal.Decimal

 定點數

String

 

str

 變長字串

Text

 

str

變長字串,對較長或不限長度的字串做了優化

Unicode

 

unicode

變長 Unicode 字串

UnicodeText

 

unicode

變長 Unicode 字串,對較長或不限長度的字串做了優化

Boolean

 

bool

布林值

Date

 

datetime.date

日期

Time

 

datetime.time

時間

DateTime

 

datetime.datetime

日期和時間

Interval

 

datetime.timedelta

時間間隔

Enum

 

str

一組字串

PickleType

任何 Python 物件 自動使用 Pickle 序列化

LargeBinary

 

str

二進位制檔案

 

hello.py:定義 Role 和 User 模型

class Role(db.Model):

__tablename__ = 'roles'

id = db.Column(db.Integer, primary_key=True)

name = db.Column(db.String(64), unique=True)

def __repr__(self):

return '<Role %r>' % self.name

class User(db.Model):

__tablename__ = 'users'

id = db.Column(db.Integer, primary_key=True)

username = db.Column(db.String(64), unique=True, index=True)

def __repr__(self):

return '<User %r>' % self.username

 

最常使用的SQLAlchemy列選項

選項名 說  明

primary_key 如果設為 True ,這列就是表的主鍵

unique 如果設為 True ,這列不允許出現重複的值

index 如果設為 True ,為這列建立索引,提升查詢效率

nullable 如果設為 True ,這列允許使用空值;如果設為 False ,這列不允許使用空值

default 為這列定義預設值

 

常用的SQLAlchemy關係選項

選項名 說  明

backref 在關係的另一個模型中新增反向引用

primaryjoin 明確指定兩個模型之間使用的聯結條件。只在模稜兩可的關係中需要指定

lazy 指定如何載入相關記錄。可選值有 select (首次訪問時按需載入)、 immediate (源物件加

載後就載入)、 joined (載入記錄,但使用聯結)、 subquery (立即載入,但使用子查詢),

noload (永不載入)和 dynamic (不載入記錄,但提供載入記錄的查詢)

 

hello.py:關係

class Role(db.Model):

# ...

users = db.relationship('User', backref='role')

class User(db.Model):

# ...

role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

 

SQLAlchemy 為很多資料庫引擎提供抽象層

 

資料庫

會話也稱為事務

 

資料庫會話能保證資料庫的一致性。提交操作使用原子方式把會話中的物件全部寫入資料

庫。

 

資料庫會話也可 回滾 。呼叫 db.session.rollback() 後,新增到資料庫會話

中的所有物件都會還原到它們在資料庫時的狀態。

 

常用的SQLAlchemy查詢過濾器

過濾器

 說  明

filter()

 把過濾器新增到原查詢上,返回一個新查詢

filter_by()

把等值過濾器新增到原查詢上,返回一個新查詢

limit()

使用指定的值限制原查詢返回的結果數量,返回一個新查詢

offset()

偏移原查詢返回的結果,返回一個新查詢

order_by()

根據指定條件對原查詢結果進行排序,返回一個新查詢

group_by()

根據指定條件對原查詢結果進行分組,返回一個新查詢

 

最常使用的SQLAlchemy查詢執行函式

方 法

說  明

all()

以列表形式返回查詢的所有結果

first()

返回查詢的第一個結果,如果沒有結果,則返回 None

first_or_404()

返回查詢的第一個結果,如果沒有結果,則終止請求,返回 404 錯誤響應

get()

返回指定主鍵對應的行,如果沒有對應的行,則返回 None

get_or_404()

返回指定主鍵對應的行,如果沒找到指定的主鍵,則終止請求,返回 404 錯誤響應

count()

返回查詢結果的數量

paginate()

返回一個 Paginate 物件,它包含指定範圍內的結果

 

@app.route('/', methods=['GET', 'POST'])

def index():

form = NameForm()

if form.validate_on_submit():

user = User.query.filter_by(username=form.name.data).first()

if user is None:

user = User(username = form.name.data)

db.session.add(user)

session['known'] = False

else:

session['known'] = True

session['name'] = form.name.data

form.name.data = ''

return redirect(url_for('index'))

return render_template('index.html',

form = form, name = session.get('name'),

known = session.get('known', False))