1. 程式人生 > >Flask--資料庫操作

Flask--資料庫操作

Flask 資料庫

1. 使用Flask-SQLAlchemy管理資料庫

Flask使用Flask-SQLAlchemy管理資料庫,安裝方式:

$ pip install flask-sqlalchemy

在 Flask-SQLAlchemy 中,資料庫使用 URL 指定:

MySQL mysql://username:[email protected]/database
Postgres postgresql://username:[email protected]/database
SQLiteUnixsqlite:////absolute/path/to/database
SQLiteWindowssqlite:///c:/absolute/path/to/database

程式使用的資料庫 URL 必須儲存到 Flask 配置物件的 SQLALCHEMY_DATABASE_URI 鍵中。
配置物件中還有一個很有用的選項, 即 SQLALCHEMY_COMMIT_ON_TEARDOWN 鍵,將其設為 True時,每次請求結束後都會自動提交資料庫中的變動。

初始化以及配置一個簡單的SQLite資料庫:

from os
from flask import Flask
from flask.ext.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)

2. 定義模型

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

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 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

類變數 __tablename__ 定義在資料庫中使用的表名。如果沒有定義 __tablename__Flask-SQLAlchemy會使用一個預設名字,但預設的表名沒有遵守使用複數形式進行命名的約定,所以最好由我們自己來指定表名。其餘的類變數都是該模型的屬性,被定義為 db.Column類的例項。

下圖顯示了最常用的SQLAlchemy列的型別:
這裡寫圖片描述

下圖顯示了最常用的SQLAlchemy列選項:
這裡寫圖片描述

Flask-SQLAlchemy 要求每個模型都要定義主鍵,這一列經常命名為 id。

3. 定義模型的關係

上面的User類和Role類中,通過下面的程式碼定義了兩個類的關係:

class Role(db.Model):
    # ...
    users = db.relationship('User', backref='role', lazy='dynamic')
class User(db.Model):
    # ...
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

之前定義了兩個表的名字:usersroles

關係使用 users 表中的外來鍵連線了兩行。新增到 User 模型中的 role_id 列被定義為外來鍵, 就是這個外來鍵建立起了關係。傳給 db.ForeignKey() 的引數 'roles.id' 表明,這列的值是 roles 表中行的 id值。

新增到 Role 模型中的 users 屬性代表這個關係的面向物件視角。對於一個 Role 類的例項,其 users 屬性將返回與角色相關聯的使用者組成的列表。db.relationship() 的第一個引數表明這個關係的另一端是哪個模型。

db.relationship() 中的 backref 引數向 User 模型中新增一個 role 屬性,從而定義反向關係。這一屬性可替代 role_id 訪問 Role 模型,此時獲取的是模型物件,而不是外來鍵的值。

其中引數lazy的作用是:禁止自動查詢,當在一個Role物件中呼叫users屬性的時候,會自動執行query,返回所有的屬於該Role物件的User物件,因此無法在此結果上附加更精確的查詢過濾器。例如原來這樣直接獲取User物件users = user_role.users,增加lazy引數後這樣獲取:user_role.users.order_by(User.username).all(),增加了更精確的過濾器。

4. 資料配置

在該部分實現資料庫的建立、初始化等工作,所以把這部分程式碼放在manage.py檔案中:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask_script import Manager, Server, Shell
from somepackage import app, db
from somepackage import User, Role

manager = Manager(app)

@manager.command
def init_db():
    """
    Init the DB and Insert test data
    """
    # this db is a SQLAlchemy instance, must be imported.
    # the create_all method is belonged to SQLAlchemy instance.
    db.create_all()

    admin_role = Role(id=1, name="Admin")
    user_role = Role(id=2, name="User")
    user_jhon = User(id=1, username="Jhon", role=admin_role)
    user_david = User(id=2, username="david", role=user_role)

    db.session.add_all([admin_role, user_role, user_jhon, user_david])
    try:
        db.session.commit()
    except Exception, e:
        db.session.rollback()
        print e

if __name__ == "__main__":
    manager.run()

注意:其中的UserRole,以及db都要從合適的包或者模組中引入進來。

這樣就能夠建立並初始化資料庫。下面看SQLAlchemy提供的過濾器和查詢函式:
這裡寫圖片描述
這裡寫圖片描述

其中filterfilter_by的區別就是:filter_by之後的條件直接是欄位=查詢的值filter之後的條件是類名.欄位=查詢條件

5. 資料庫操作

通過上面的配置就可以在檢視函式中操作資料庫了:

@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)

相關推薦

Flask--資料庫操作

Flask 資料庫 1. 使用Flask-SQLAlchemy管理資料庫 Flask使用Flask-SQLAlchemy管理資料庫,安裝方式: $ pip install flask-sqlalchemy 在 Flask-SQLAlchemy 中,資

Flask-SQLAlchemy資料庫操作

建表 # -*- coding: UTF-8 -*- from . import db #多對多關係表,兩組一對多,即為多對多 class Boy2Girl(db.Model): __tablename__ = 'boy2girl' nid = db.Column(db.Intege

flask連線mysql資料庫操作增刪改查的簡單封裝函式

Y17 1、建立python資料夾,命名為app,建立並返回一個WGSI應用程式物件 from flask import Flask app = Flask(__name__) # 定義函式封裝路由配置 def path(route, fun, *, methods=['GE

python框架flask連線mysql資料庫操作

最近在用flask框架做一個python web專案,其中要連線資料庫,所以總結如下: 如何用pycharm快速建立一個flask專案我就不詳細說了,可以先建立虛擬環境,不過大部分的事pycharm都

flask框架操作MySQL資料庫

前言 經測試,id主鍵預設自動增長,Stringl型別對應MySQL資料庫中的varchar型別,外來鍵預設沒有觸發方式。 設定資料庫編碼為uft8,則預設編碼都為utf8。 示例 # -*- coding:utf-8 -*- from flask import Flask

flask連線mysql資料庫操作

Y21   以簡單的年級表格模型為例,介紹資料庫的增刪改查,條件查詢等操作 程式碼,以下: from app import db # 定義資料模型, 設定表格中各個欄位的資料型別 class Grade(db.Model): g_id = db.C

Flask的mysql資料庫操作,增刪改查

#增 def createOne(): artcle1 = Artcle_table2(title='標題',content='內容') db.session.add(artcle1) db.session.commit() return '新

flask + pymysql操作Mysql數據庫

ext efault 自動提交 ble ring mat 3-9 ret conf 安裝flask-sqlalchemy、pymysql模塊 pip install flask-sqlalchemy pymysql 安裝Mysql數據庫 from flask.e

FlaskFlask Cookie操作

否則 timedelta 什麽 bsp gis time delet 主域名 res ### 什麽是cookie:在網站中,http請求是無狀態的。也就是說即使第一次和服務器連接後並且登錄成功後,第二次請求服務器依然不能知道當前請求是哪個用戶。cookie的出現就是為了解決

MongoDB資料庫操作常用語法

一、建立資料庫 建立: use DATABASE_NAME(資料庫名稱) 如果資料庫不存在,則建立資料庫,否則切換到指定資料庫。 顯示所有資料庫: show dbs 剛建立的資料庫,並不在資料庫的列表中, 要顯示它,我們需要向其中插入一些資料。 插入資料: db.DATABASE_NAM

JDBC資料庫連線池連線資料庫資料庫操作DAO層設計通用更新及查詢方法(二)

上篇文章主要介紹了通過資料庫連線池連線資料庫,然後設計了對資料庫通用更新和查詢方法,本篇文章主要通過例項介紹上篇文章定義的對資料庫操作的幾個方法的使用:     首先我們先在資料庫建立一個學生資訊表Student欄位如圖: 建立好表將配置檔案的資訊改好然後需要建立一

JDBC資料庫連線池連線資料庫資料庫操作DAO層設計通用更新及查詢方法(一)

該篇文章介紹了資料庫連線池獲取資料庫連線以及資料庫操作的基本使用,然後主要提供了java專案案例中dao層的一種設計,利用反射的原理定義了通用的查詢方法可以對應所有的表和例項。文章中的每段程式碼都提供了詳細的註釋及邏輯步驟 首先匯入資料庫連線的所需要的jar包:    

OpenStack 資料庫操作 demo

1 #!/usr/bin/env python 2 3 from sqlalchemy.orm import sessionmaker 4 from sqlalchemy import create_engine 5 from sqlalchemy.ext.declarative impor

Python - - MySQL資料庫 - - 操作錦集

注:環境配置資訊,系統環境CentOS 7.4,資料庫版本 mysql-5.7.24 1,跳過授權表 # 在命令列跳過授權表命令 mysqld_safe --skip-grant-tables & # 在 my.cnf 檔案配置跳過授權表命令 [mysqld] skip-grant-t

iOS資料庫操作

iOS的資料庫是sqlite3,是模糊型別的資料庫,但是仍然不能隨便定義資料型別 * 使用時首先匯入資料庫包,然後宣告資料庫變數:sqlite3 *db; * 開啟資料庫: NSArray *paths = NSSearchPathForDirectoriesInDomains(N

Django框架——ORM資料庫操作

目錄 一.增加 二.刪除 三.修改 四.查詢 1.基本查詢 2.過濾查詢 3.過濾條件語法 4.F物件和Q物件 5.聚合函式 6.排序函式 7.關聯查詢

簡單Java類和資料庫操作及javafx的結合小專案

先圖為上   秦時明月漢時關,萬里長征人未還,妙呀,甚是..   1.開始 1.專案目的:   開發工具: Idea + Mysql + JAVASE   1.其實簡單來說就是實現兩張資料表的基本操作,     1.新增     2. 刪除     3.修改

Django—ORM資料庫操作

---恢復內容開始--- 一、orm介紹 1 ORM即Object Relational Mapping,全稱物件關係對映。 優點: 1 不用寫sql,不會sql的人也可以寫程式 2 開發效率高 2 缺點: 1 可能sql的效率低 3 如何使用:

利用c3p0的QueryRunner類封裝資料庫操作

文章目錄 前言 1. 準備 2. 封裝資料庫連線 3. 使用QueryRunner類,實現對資料表的 insert delete update 4. 小結 前言 鑑於最近做一個小專案,想要自己封裝資料庫操作類,但是網上的各種

PYTHON自動化Day6-函式多個返回值和匿名函式、列表生成式,三元運算子,os模組,sys模組,時間模組,字典排序,資料庫操作,加密(md5)

一.函式多個返回值和匿名函式 #函式返回多個值,用一個變數接收 def say(): num1=1 num2=2 num3=3 return num1,num2,num3 res=say() print(res) #打印出來是元組。 函式如果返回多個值的話,會把返回的