flask--relationship

來源:互聯網
上載者:User

標籤: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資料庫,配置代碼 如下:

  1.  from flask import Flask
  2.  from flask.ext.sqlalchemy import SQLAlchemy
  3.  import os
  4.   
  5.  baseDir = os.path.abspath(os.path.dirname(__file__))
  6.   
  7.  app = Flask(__name__)
  8.  app.config[‘SQLALCHEMY_DATABASE_URI‘] =\
  9.   ‘sqlite:////‘ + os.path.join(baseDir,‘data.sqlite‘)
  10.  app.config[‘SQLALCHEMY_COMMIT_ON_TEARDOWN‘] = True
  11.   
  12.  db = SQLAlchemy(app)
  13.   
2.定義模型

定義一個使用者表users和一個角色表roles,代碼如下:

  1.  class User(db.Model):
  2.   __tablename__ = ‘users‘
  3.   id = db.Column(db.Integer,primary_key=True)
  4.   username = db.Column(db.String(64),unique=True,index=True)
  5.   
  6.   def __repr__(self):
  7.   return ‘<User %r>‘ % self.username
  8.   
  9.   
  10.  class Role(db.Model):
  11.   __tablename__ = ‘roles‘
  12.   id = db.Column(db.Integer,primary_key=True)
  13.   name = db.Column(db.String(64),unique=True)
  14.   
  15.   def __repr__(self):
  16.   return ‘<Role %r>‘ % self.name
  17.   

解釋下:

0.兩個類User和Role繼承自db.Model
1.__tablename__用來指定表名稱
2.db.Column函數指定了資料庫中欄位的類型,是否是主鍵(primary_key),是否唯一(unique),是否加索引(index),還有其他的比如:是否可以為空白(nullable=True),預設值(default)

3.關係

使用關係型資料庫,不指定關係怎麼能行。定義模型中我們沒有指定關係,一個使用者有一個角色,一個角色可以屬於多個使用者,典型的一對多的關係,如何在Flask-SQLAlchemy中定義關係?

上代碼:

  1.  class User(db.Model):
  2.   __tablename__ = ‘users‘
  3.   id = db.Column(db.Integer,primary_key=True)
  4.   username = db.Column(db.String(64),unique=True,index=True)
  5.   
  6.   role_id = db.Column(db.Integer,db.ForeignKey(‘roles.id‘))
  7.   
  8.   def __repr__(self):
  9.   return ‘<User %r>‘ % self.username
  10.   
  11.   
  12.  class Role(db.Model):
  13.   __tablename__ = ‘roles‘
  14.   id = db.Column(db.Integer,primary_key=True)
  15.   name = db.Column(db.String(64),unique=True)
  16.   
  17.   users = db.relationship(‘User‘,backref=‘role‘)
  18.   
  19.   
  20.   def __repr__(self):
  21.   return ‘<Role %r>‘ % self.name
  22.   

添加了兩行代碼:

第一行,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。如下:

  1.  db.Relationship(‘User‘,backref=‘role‘,uselist=False)
  2.   

至於多對多關係,以後會慢慢介紹。

4.資料庫操作

資料庫操作,基本的一些:資料庫、表建立或刪除,資料的增刪改查。

0.建立資料庫和表
  1.  db.create_all()
  2.   

上面說的users表和roles表就建立了。

1.刪除資料庫
  1.  db.drop_all()
  2.   
1.插入行
  1.  role_admin = Role(name=‘Admin‘)
  2.  user_tom = User(username=‘tom‘,role=role_admin)
  3.  user_jim = User(username=‘jim‘,role=role_admin)
  4.  user_tim = User(username=‘tim‘,role=role_admin)
  5.  user_sam = User(username=‘sam‘,role=role_admin)
  6.  db.session.add(role_admin)
  7.  db.session.add(user_tom)
  8.  db.session.add(user_jim)
  9.  db.session.commit()

通過資料庫會話管理對資料庫所做的改動,在Flask-SQLAlchemy中,會話由db.session表示,準備把隊形寫入資料庫之前,先要將其添加到會話中。寫入資料庫需要調用db.session.commit()方法。

2.修改行

我們將role_admin變數中name為Admin改成Administrator。

  1.  role_admin.name=‘Administrator‘
  2.  db.session.add(role_admin)
  3.  db.session.commit()
3.刪除行

刪除Jim使用者

  1.  db.session.delete(user_jim)
  2.  db.session.commit()
  3.   
4.查詢行

查詢所有使用者

User.query.all() #返回結果:[<User ‘tom‘>, <User ‘tim‘>, <User ‘sam‘>]

flask--relationship

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.