【Python3】Flask SQLAlchemy 操作Mysql數(shù)據(jù)庫

作為一個(gè)Android開發(fā)工程師,對(duì)于后臺(tái)相關(guān)的知識(shí)從來都沒有深入的了解,在整個(gè)開發(fā)流程中,對(duì)后臺(tái)這一塊總是迷迷糊糊。本來對(duì)Java應(yīng)該是比較熟悉的,使用Java來開發(fā)應(yīng)該是比較合適的,但想到Python在近期非常的火熱,于是想在學(xué)習(xí)后臺(tái)開發(fā)的時(shí)候,順便也學(xué)習(xí)一下Python的基礎(chǔ)知識(shí)。于是開始了使用Python開發(fā)后臺(tái)的學(xué)習(xí)過程。本文就是在學(xué)習(xí)如何操作數(shù)據(jù)的時(shí)候,為了加深理解,也方便后續(xù)查閱形整理的。

SQLAlchemy是Python的一個(gè)ORM(對(duì)象關(guān)系映射)框架,可以讓我們不需要寫SQL語句就可以方便的操作數(shù)據(jù)庫,只要定義相關(guān)的表類,就可以生成對(duì)應(yīng)的表,以及通過定義的表類就可以方便地對(duì)數(shù)據(jù)庫進(jìn)行增刪改查操作。

  • 注:本文操作環(huán)境為Mac。

一、安裝

  • 安裝mysql,使用homebrew來安裝
> brew install mysql
# 隨后根據(jù)提示配置數(shù)據(jù)庫密碼,是否禁止遠(yuǎn)程登陸,是否刪除匿名用戶等

由于SQLAlchemy沒辦法直接連接mysql,需要通過第三方驅(qū)動(dòng)來連接,這里選擇mysql-python。

  • 安裝mysql驅(qū)動(dòng)mysql-python
# 首先安裝mysql-connector-c
> brew install mysql-connector-c

# 再安裝mysql-python
> sudo python3 -m pip install mysql-python
  • 安裝SQLAlchemy
> python3 -m pip install flask-sqlalchemy

二、新建數(shù)據(jù)庫 flaskdb

@>mysql -u root -p

@>密碼(默認(rèn)為空)
 
# 戶創(chuàng)建一個(gè)數(shù)據(jù)庫flaskdb
mysql>create database flaskdb;

# 授權(quán)
mysql>grant all privileges on flaskdb.* to root@localhost identified by 'root';

# 刷新權(quán)限
mysql>flush privileges;

三、建立工程

使用Pycharm建立flask工程,工程名稱:FlaskDemo

配置數(shù)據(jù)庫訪問路徑,用戶和密碼,在工程根目錄下的config.py文件中添加:

# config.py

# 配置 sqlalchemy  "數(shù)據(jù)庫+數(shù)據(jù)庫驅(qū)動(dòng)://數(shù)據(jù)庫用戶名:密碼@主機(jī)地址:端口/數(shù)據(jù)庫?編碼"
SQLALCHEMY_DATABASE_URI = "mysql://root:root@localhost:5000/flaskdb"

這里配置了SQLAlchemy默認(rèn)的mysql驅(qū)動(dòng),驅(qū)動(dòng)與安裝的數(shù)據(jù)庫有關(guān)系,我們之前安裝的是mysql數(shù)據(jù)庫,并且驅(qū)動(dòng)為mysql-python
具體可以參考 http://docs.sqlalchemy.org/en/latest/core/engines.html?highlight=database#database-urls

四、初始化工程和數(shù)據(jù)庫

操作數(shù)據(jù)庫有兩種方式,一是使用flask_sqlalchemy,另一個(gè)是直接使用原始的sqlalchemy。
其中flask-sqlalchemy是對(duì)sqlalchemy進(jìn)行了一些封裝,提供了一些常用工具,使用更簡潔。

這里我們使用flask-sqlalchemy對(duì)數(shù)據(jù)進(jìn)行操作,使用原始sqlalchemy的流程基本是一樣的,使用語法稍微有點(diǎn)區(qū)別【具體可以參考文末Demo的just_sqlalchemy分支】。
  • 新建db.py文件,創(chuàng)建db
# db.py

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
  • 在工程根目錄下的init.py下(主要的初始化流程都做了注釋):
# __init__.py

from flask import Flask
from db import db


app = Flask(__name__) # 新建app對(duì)象

app.config.from_object('config') # 加載配置信息,其中有數(shù)據(jù)庫的配置信息,包含在SQLALCHEMY_DATABASE_URI中

# 初始化db,并創(chuàng)建models中定義的表格
with app.app_context(): # 添加這一句,否則會(huì)報(bào)數(shù)據(jù)庫找不到application和context錯(cuò)誤
    db.init_app(app) # 初始化db
    db.create_all() # 創(chuàng)建所有未創(chuàng)建的table
  • 初始化工程:
    在FlaskDemo.py文件中:
# FlaskDemo.py

from _init_ import app

@app.route('/')
def hello_flask():
    return 'Hello Flask!'


if __name__ == '__main__':
    app.debug = app.config['DEBUG'] # 配置為Debug模式,這樣修改文件后,會(huì)自動(dòng)重啟服務(wù)
    app.run(host='0.0.0.0') # 這里配置為可在局域網(wǎng)中訪問,默認(rèn)為127.0.0.1,只能在本機(jī)訪問

五、建立數(shù)據(jù)庫表類

  • 新建models.py文件,并創(chuàng)建User數(shù)據(jù)表類
# models.py

from db import db


class User(db.Model):

    # Columns

    __tablename__ = 'users'

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

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

    pwd = db.Column(db.Integer, default=0)

    def __init__(self, name, pwd):
        self.name = name
        self.pwd = pwd

    def __repr__(self):
        return '<User %r>' % self.name

    def __str__(self):
        return '<User %s>' % self.name

其中,

__tablename__ = 'users'

表示數(shù)據(jù)表名字為users,也可以不寫,此時(shí)數(shù)據(jù)表名稱為類名:user

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

表示創(chuàng)建一列數(shù)據(jù),列的關(guān)鍵字為id, primary_key=True表示該列數(shù)據(jù)作為主鍵, 類型為int,autoincrement=True自增

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

表示創(chuàng)建一列數(shù)據(jù),列的關(guān)鍵字為name, 類型為string,最長長度為64位,unique=True表示唯一,index=True表示添加索引

那么,用戶數(shù)據(jù)列表如下:

id name pwd
1 0
2 123
3 1234
  • 運(yùn)行項(xiàng)目

通過Pycharm Run FlaskDemo?;蛘呙钚羞\(yùn)行:

python3 FlaskDemo

此時(shí)就會(huì)在flaskdb中創(chuàng)建出users數(shù)據(jù)表

六、使用數(shù)據(jù)庫

  • 插入數(shù)據(jù):
def insert(name, pwd):
    user = User(name, pwd=pwd)
    db.session.add(user)
    db.session.commit()
  • 查詢指定數(shù)據(jù):
def search(name):
    user = User.query.filter(User.name == name).first()
    if user is None or user.name.strip == '':
        print('用戶不存在')
    else:
        print(' 用戶 %s' % user.name)
  • 查詢?nèi)繑?shù)據(jù)
def checkAll():
    user = User.query.all()
    print(user)
  • 修改數(shù)據(jù)
def update(name, pwd):
    user = User.query.filter(User.name == name).first()
    if user is not None:
        user.thrust = pwd
        db.session.commit()
        print('修改 用戶 %s ,密碼為:%s' % (name, pwd))
    else:
        print('用戶不存在')
  • 刪除數(shù)據(jù)
def delete(name, pwd):
    user = User.query.filter(User.name == name, User.thrust == pwd).first()
    if user is not None:
        db.session.delete(user)
        db.session.commit()
        print('刪除 用戶 %s ,密碼為:%s' % (name, pwd))
    else:
        print('用戶不存在,或密碼不正確')

最后

通過以上,基本上就可以對(duì)數(shù)據(jù)庫進(jìn)行一些基本的增刪改查等操作??梢哉f是非常的方便,甚至可以不需要懂SQL相關(guān)的知識(shí),但是為了更好的理解,建議還是學(xué)習(xí)一下SQL的基本知識(shí)。

練手DEMO

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容