文章目錄
一、flask 數據庫操作
1. flask鏈接操作數據庫使用的框架
django 中使用ORM鏈接操作數據庫,如果不能夠用ORM 站點管理功能不能夠使用
python使用pymysql鏈接操作數據庫,flask中也可以使用pymysql鏈接
sqlalchemy: python的開源的ORM框架,在flask中使用flask-sqlalchemy;是通過flask對sqlalchemy 進行封裝
2. 安裝flask-sqlalchemy
pip install flask-sqlalchemy
pip install pymysql
3. 使用(配置mysql和sqlite鏈接並使用)
① 鏈接數據庫配置信息
這裏使用如下兩種數據庫:
sqlite3
mysql
- 進入官方文檔查看相應配置
- 配置信息
如下所示:
② 配置sqlite數據庫
注意:////tmp/test.db 中;///固定格式/tmp代表linux環境下根目錄的文件夾目錄/test.db代表tmp目錄下的test.db文件;在windows下直接寫///後面接絕對路徑即可D:/flask/project
- 找到文件所在路徑
獲取當前文件所在的根目錄
-
找到當前文件 print(“file”)
-
config類似於django中的settings
-
配置文件sqlite3數據庫在本機的位置
修改到本機後的配置
BASE_DIR路徑和app.config[“SQLALCHEMY_DATABASE_URI”]打印結果
-
鏈接數據庫格式(sqlite3)
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os
app = Flask(__name__)
## 學習sqlalchemy
## 連接數據庫 sqlite3
BASE_DIR = os.path.abspath(os.path.dirname(__file__))##當前文件 項目所在根目錄
app.config["SQLALCHEMY_DATABASE_URI"]="sqlite:///" + os.path.join(BASE_DIR,"test.db") ## 鏈接sqlite3配置
app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"] = True ## 請求結束之後自動提交
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True ## 跟蹤修改 flask 1.x 之後增加的配置項
db = SQLAlchemy(app) ## 綁定flask項目
## 創建模型
class UserInfo(db.Model):
## 字段
__tablename__ = "userinfo" ## 指定表名
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(32))
time = db.Column(db.DATETIME)
## 數據遷移
db.create_all() ## 同步表結構
@app.route("/")
def index():
return "ORM測試"
if __name__ == '__main__':
app.run()
- 生成表結構後查看
③ 配置鏈接mysql文件
配置mysql與sqlite很相似,只是在獲取數據庫的地方有所區別
添加跟蹤修改配置的原因:
上面一行有錯跟蹤修改的單詞有誤,修改如下
- 可以設置配置文件DEBUG爲True
app.config["DEBUG"] = True # 修改後自動啓動項目,會報錯
4. 字段類型 和 字段屬性
__tablename__= "表名" ##指定表名;相當於元數據設置表名
① 字段類型
db.Column接的字段 | 意義 |
---|---|
String | 字符串 |
Integer | 整型 |
DATETIME | 日期時間 datetime.datetime |
Text | str 可變大小的字符串類型 |
DATE | 日期datetime.date |
Boolean | bool 布爾型 |
Time | date time.time |
Unicode | unicode 可變長度的Unicode字符串類型 |
UnicodeText | unicode 不限制長度 |
Enum | 可以是任何類型的python對象 枚舉 |
BigInteger | int 整型 |
Float | float(當asdecimal=True時,強制轉換爲decimal.Decimal對象) 浮點型 |
② 字段屬性 flask --db-Column屬性
有如下一些:
使用datetime要導包
from datetime import datetime
db.Column接的屬性 | 意義 |
---|---|
primary_key | 如果設爲 True,這列就是表的主鍵 |
unique | 如果設爲 True,這列不允許出現重複的值 |
index | 如果設爲 True,爲這列創建索引,提升查詢效率 |
nullable | 如果設爲 True,這列允許使用空值;如果設爲 False,這列不允許使用空值 |
default | 爲這列定義默認值 |
default=datetime.now() | 默認爲當前時間 |
enum舉例
import enum
class MyEnum(enum.Enum):
one = 1
two = 2
three = 3
t = Table(
'data', MetaData(),
Column('value', Enum(MyEnum))
)
connection.execute(t.insert(), {"value": MyEnum.two})
assert connection.scalar(t.select()) is MyEnum.two
5. 使用create_all() 同步表結構
- 表結構沒發生變化,再次執行不會報錯
- 修改模型屬性,不同步表結構
- 增加模型,同步表
數據遷移的應用:
- django中,要使用數據遷移
- flask可用可不用 create_all()
- 用 少見,
- 不用 先創建表和表結構
- 創建模型 進行映射
django-》 makemigrations migrate
6. 使用配置文件的幾種方法
① 所有的代碼都寫在一個py文件中使用
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os
app = Flask(__name__)
## 學習sqlalchemy
## 連接數據庫 sqlite3
BASE_DIR = os.path.abspath(os.path.dirname(__file__))##當前文件 項目所在根目錄
app.config["SQLALCHEMY_DATABASE_URI"]="sqlite:///" + os.path.join(BASE_DIR,"test.db") ## 鏈接sqlite3配置
app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"] = True ## 請求結束之後自動提交
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True ## 跟蹤修改 flask 1.x 之後增加的配置項
db = SQLAlchemy(app) ## 綁定flask項目
## 創建模型
class UserInfo(db.Model):
## 字段
__tablename__ = "userinfo" ## 指定表名
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(32))
time = db.Column(db.DATETIME)
## 數據遷移
db.create_all() ## 同步表結構
@app.route("/")
def index():
return "ORM測試"
if __name__ == '__main__':
app.run()
② 封裝settings配置文件
- 第一種 直接編寫
應用: 比較直觀,應用在小型的項目
- 第二種 編寫配置文件
應用:作爲默認配置寫在文件中
settings.py
app.config.from_pyfile("settings.py") ## 使用python文件做配置文件
- 第三種 使用類對象
應用:在項目中使用固定的配置
- 第四種 使用環境變量
環境變量: 操作系統運行環境的時候需要的變量信息
應用場景: 配置文件的地址不固定,配置文件私密
在linux 中配置 export KEY = VALUE
配置環境變量DEBUG舉例
報錯
添加環境變量
完整的正確寫法
silent: 決定加載環境變量的時候,是否報錯
- True 安靜處理,如果沒有對應的環境變量,忽略
- False 不安靜處理 當加載環境,沒有對應環境變量的時候,報錯
二、項目的優化
上面的代碼,將視圖和模型寫在了一個文件當中,在工作中,不能夠將模型和試圖寫在一個文件中,flask也是遵循MVC的設計模式,是一種解耦合
一般在項目中,創建子應用來方便管理項目 例如:
1. views視圖
用來編寫函數;大致部分如下:
- 從封裝好的py文件中導包,將使用到的導入
- 接受的各種請求處理函數
- 運行文件(可寫可不寫,可以直接通過終端來運行文件:通過封裝好的方法)
2. models 模型
from main import db
import datetime
class BaseModel(db.Model):
##
__abstract__ = True ### 聲明當前類爲抽象類,被繼承 調用不會被創建
id = db.Column(db.Integer,primary_key=True)
def save(self):
db.session.add(self)
db.session.commit()
def merge(self):
db.session.merge(self)
db.session.commit()
def delete(self):
db.session.delete(self)
db.session.commit()
class UserInfo(BaseModel):
__tablename__ = 'userinfo' ## 表名
# id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(32))
age = db.Column(db.Integer)
time = db.Column(db.DATETIME,default=datetime.datetime.now()) ## auto_now = True
class User(BaseModel):
__tablename__ = "user"
name = db.Column(db.String(32))
phone = db.Column(db.String(11))
- 基類:
- 其他類
3. manage.py 封裝如下(migrate和runserver)
通過判斷來達到預期效果
修改後:
- 在flask中有自帶方法可以使我們更好的使用manage.py文件
4. settings配置文件
5. main.py
主要用來和settings配合加載配置項和sqlalchemy綁定flask項目
三、 幾種加載settings方式
# app.config.from_pyfile("settings.py") ## 使用python文件做配置文件
# app.config.from_object("settings.TestConfig")
# app.config.from_envvar() ## 環境變量中加載
# app.config.from_json() ## 從json串中加載
# app.config.from_mapping() ## mapping ---> 字典類型