標籤:postgresq 角色 conf dir 屬性 creat function 檔案的 兩種
本文主要介紹如何使用flask操作資料庫。
資料庫按照一定規則儲存程式資料,程式再發起查詢取回所需的資料。Web程式最常用基於關聯式模式的資料庫,這種資料庫也稱為SQL資料,因為它們使用結構化查詢語句。不過最近幾年文檔資料庫和索引值對資料庫成了流行的替代選擇,這兩種資料庫合稱為NoSQL資料庫。
大多數的資料庫引擎都有對應的Python包,包括開源寶和商業包。Flask並不限制你使用何種類型的資料庫包,因此可以根據自己的喜好選擇使用MySQL、Postgres、SQLite,Redis、MongoDB或者CouchDB。
如果這些都無法滿足需求,還有一些資料庫抽象層程式碼封裝供選擇,例如SQLAlchemy和MongoEngine。你可以使用這些抽象包直接處理高等級的Python對象,而不用處理如表、文檔或查詢語言此類的資料庫實體。
選擇架構時,你不一定非得選擇已經整合了Flask的架構,但選擇這些架構可以節約你編寫整合代碼的時間。使用整合了Flask的架構可以簡化配置和操作,所以專門為Flask開發的擴充是你的首選。
關於選擇使用的資料庫架構,選擇的是Flask-SQLAlchemy。
0.安裝Flask-SQLAlchemy
pip install flask-sqlalchemy
1.配置Flask-SQLAlchemy
在Flask-SQLAlchemy中,資料庫使用URL指定。
MySQL : mysql://username:[email protected]/database
Postgres : postgresql://username:[email protected]/database
SQLite : sqlite:////absolute/path/to/database
在這些URL中,hostname表示MySQL服務所在的主機,可以是本地主機(localhost),也可以是遠程伺服器。資料庫伺服器上可以託管多個資料庫,因此database表示要使用的資料庫名。如果資料庫需要進行認證,username和password表示資料庫的使用者名稱和密碼。
SQLite資料庫不需要使用伺服器,因此不用指定hostname、username和password。URL中的database是硬碟上檔案的檔案名稱。
程式使用的資料庫URL必須儲存到Flask設定物件的SQLALCHEMY_DATABASE_URI鍵中。設定物件中還有一個很有用的選項,即SQLALCHEMY_ON_REARDOWN鍵,將其設定為True時,每次請求結束後都會自動認可資料庫中的變動。
我們使用SQLite資料庫,配置代碼 如下:
-
from flask import Flask
-
from flask.ext.sqlalchemy import SQLAlchemy
-
import os
-
-
baseDir = os.path.abspath(os.path.dirname(__file__))
-
-
app = Flask(__name__)
-
app.config[‘SQLALCHEMY_DATABASE_URI‘] =\
-
‘sqlite:////‘ + os.path.join(baseDir,‘data.sqlite‘)
-
app.config[‘SQLALCHEMY_COMMIT_ON_TEARDOWN‘] = True
-
-
db = SQLAlchemy(app)
-
2.定義模型
定義一個使用者表users和一個角色表roles,代碼如下:
-
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
-
-
-
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
-
解釋下:
0.兩個類User和Role繼承自db.Model
1.__tablename__用來指定表名稱
2.db.Column函數指定了資料庫中欄位的類型,是否是主鍵(primary_key),是否唯一(unique),是否加索引(index),還有其他的比如:是否可以為空白(nullable=True),預設值(default)
3.關係
使用關係型資料庫,不指定關係怎麼能行。定義模型中我們沒有指定關係,一個使用者有一個角色,一個角色可以屬於多個使用者,典型的一對多的關係,如何在Flask-SQLAlchemy中定義關係?
上代碼:
-
class User(db.Model):
-
__tablename__ = ‘users‘
-
id = db.Column(db.Integer,primary_key=True)
-
username = db.Column(db.String(64),unique=True,index=True)
-
-
role_id = db.Column(db.Integer,db.ForeignKey(‘roles.id‘))
-
-
def __repr__(self):
-
return ‘<User %r>‘ % self.username
-
-
-
class Role(db.Model):
-
__tablename__ = ‘roles‘
-
id = db.Column(db.Integer,primary_key=True)
-
name = db.Column(db.String(64),unique=True)
-
-
users = db.relationship(‘User‘,backref=‘role‘)
-
-
-
def __repr__(self):
-
return ‘<Role %r>‘ % self.name
-
添加了兩行代碼:
第一行,User類中:
role_id = db.Column(db.Integer,db.ForeignKey(‘roles.id‘))
這句話比較好理解,和上面普通變數差不多,就是User類中添加了一個role_id變數,資料類型db.Integer,第二個參數指定外鍵是哪個表中哪個id。
第二行,Role類中:
users = db.Relationship(‘User‘,backref=‘role‘)
這句話比較複雜,仔細讀下面的話:
0.添加到Role模型中的users屬性代表這個關係的物件導向視角。對於一個Role類的執行個體,其users屬性將返回與角色相關聯的使用者組成的列表。
1.db.Relationship()第一個參數表明這個關係的另一端是哪個模型(類)。如果模型類尚未定義,可使用字串形式指定。
2.db.Relationship()第二個參數backref,將向User類中添加一個role屬性,從而定義反向關係。這一屬性可替代role_id訪問Role模型,此時擷取的是模型對象,而不是外鍵的值。
上面的關係為一對多關聯性的表示,一對一怎麼辦?
調用db.Relationship()時需要把userlist參數設定為False。如下:
-
db.Relationship(‘User‘,backref=‘role‘,uselist=False)
-
至於多對多關係,以後會慢慢介紹。
4.資料庫操作
資料庫操作,基本的一些:資料庫、表建立或刪除,資料的增刪改查。
0.建立資料庫和表
-
db.create_all()
-
上面說的users表和roles表就建立了。
1.刪除資料庫
-
db.drop_all()
-
1.插入行
- role_admin = Role(name=‘Admin‘)
- user_tom = User(username=‘tom‘,role=role_admin)
- user_jim = User(username=‘jim‘,role=role_admin)
- user_tim = User(username=‘tim‘,role=role_admin)
- user_sam = User(username=‘sam‘,role=role_admin)
- db.session.add(role_admin)
- db.session.add(user_tom)
- db.session.add(user_jim)
- db.session.commit()
通過資料庫會話管理對資料庫所做的改動,在Flask-SQLAlchemy中,會話由db.session表示,準備把隊形寫入資料庫之前,先要將其添加到會話中。寫入資料庫需要調用db.session.commit()方法。
2.修改行
我們將role_admin變數中name為Admin改成Administrator。
- role_admin.name=‘Administrator‘
- db.session.add(role_admin)
- db.session.commit()
3.刪除行
刪除Jim使用者
-
db.session.delete(user_jim)
-
db.session.commit()
-
4.查詢行
查詢所有使用者
User.query.all() #返回結果:[<User ‘tom‘>, <User ‘tim‘>, <User ‘sam‘>]
flask--relationship