一、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 ---> 字典类型