1. 程式人生 > >flask數據庫管理

flask數據庫管理

類型 繼承 類定義 關系型數據庫 shell ESS not AD relation

1.SQL數據庫與NoSQL數據庫

SQL數據庫由不同的表組成,表和表之間由關系連接。每個表中存在一列主鍵,主表中的某列可用其他表的主鍵表示,這樣的關系構成關系型數據庫。

NoSQL數據庫即Not Only SQL,存在不同類型的NoSQL。

2.Flask - SQLAlchemy

(1)初始化

這裏我們還是使用SQLAlchemy數據庫。

(venv) $pip install flask-sqlalchemy

在Index.py中配置數據庫

from flask_sqlalchemy import SQLAlchemy

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)

數據庫中的表用類定義,各個屬性即為表的列,各個實例即為表的行:

class User(db.Model)
    __tablename__ = users‘ , 
    id = db.Colomn(db.Integer , primary_key = True)
    username 
= db.Colomn(db.String(64) , unique = True , index = True) role_id = db.Colomn(db.Integer, db.ForeignKey(roles.id)) def __repr__: return <User %r> % self.username

其中繼承db.colomn的變量即為表中的列,示例中定義主鍵為id,id數據類型為數值型,username列的值不能重復且建立索引,role_id是外鍵且連接表名為roles的表的id列。

class Role(db.Model):
    
__tablename__ = roles id = db.Colomn(db.Integer , primary_key = True) name = db.Colomn(db.String(64) , unique = True) users = db.relationship(User , backref = role) def __repr__: return <Role %r>‘ % self.name

此處一個角色很可能有多個用戶與其對應,因此其實是一個一對多關系。relationship方法第一個參數設定與其連接的表對應的類,第二個參數backref將在User類中添加role屬性,此處role屬性可替代role_id的作用,註意此時獲取的不是外鍵的值,而是該實例整體。

在建立了表的基本結構之後,我們在shell中創建表:

(venv) $ python hello.py shell
>>> from hello import db
>>> db.creat_all()

(2)輸入數據

>>> from hello import Role,User
>>> admin_role = Role(name = ‘Admin‘)
>>> mod_role = Role(name = ‘Moderator‘)
>>> user_role = Role(name = ‘User‘)
>>> user_John = User(username = ‘John‘, role = admin_role)
>>> user_Susan = User(username = ‘Susan‘, role = user_role)
>>> user_David = User(username = ‘David‘), role = user_role)

但此時數據尚未寫入數據庫,只存在與Python中:

>>> print(admin_role.id)
None

首先寫入數據庫會話

>>> db.session.add(admin_role)
>>> db.session.add(mod_role)

... ...  

>>> db.session.add_all([admin_role,mod_role,user_role,user_John,user_Susan,user_David])

提交會話(保存到數據庫):

>>> db.session.commit()

(3)編輯數據

修改數據即將數據重新提交一遍:

>>> admin_role.name = ‘Administrator>>> db.session.add(admin_role)
>>> db.session.commit()

刪除數據:

>>> db.session.delete(mod_rate)
>>> db.session.commit()

-

flask數據庫管理