作為一個(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í)。