flask数据库操作
django中使用ORM连接操作数据库
python使用pymysql链接数操作数据库,flask中也可以使用pymysql链接
sqlalchemy:python的开源的ORM框架
flask-sqlalchemy
对sqlalchemy进行封装
安装
pip install falsk-sqlalchemy
pip intall pymysql
官方文档
使用
链接数据库
sqllist3
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import osapp = Flask(__name__)
## 学习sqlalchemy
## 链接数据库
BASE_DIR = os.path.abspath(os.path.dirname(__file__))##当前文件 项目所在的根目录
print (BASE_DIR)
# "sqlite:tmp/test.db" ###链接sqllit3 配置
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + os.path.join(BASE_DIR,"test.db") ##链接sqllit3 配置
app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"] = True ### 请求结束之后自动提交
app.config["SQLALCHEMY_RTACK_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() ## 同步表结构
mysql
使用mysql 首先要创建库
进行表结构的同步(数据迁移)
create_all() #同步表结构
- 表结构没发生变化,再次执行不会报错
- 修改模型属性 不同步表结构
- 增加模型,同步表
数据迁移的应用
- django中,要使用数据迁移
- flask可用可不用, create_all()
- flask 不用:先创建表和表结构,创建模型,进行映射
创建模型
字段类型
字符串 数字 日期
字段属性:
string(32) text datatime date integer 整型 float 浮点型
字段约束
primary_key
autoincrement
unique
default
nullable
操作数据库
增加
增加单条
#单条增加 add
userinfo = UserInfo(name='laowang',age=19)
db.session.add(userinfo)
db.session.commit()
增加多条
db.session.add_all([
UserInfo(name='laowang',age=19),
UserInfo(name='laowang',age=19),
UserInfo(name='laowang',age=19),
UserInfo(name='laowang',age=19),
UserInfo(name='laowang',age=19)
])
db.session.commit()
查询
- all
返回所有数据
列表
data = UserInfo.query.all()
print(data)
使用for循环 获取每个对象的值
- get
返回是一个对象
只能通过id进行查询
如果没有结果 返回None
data = UserInfo.query.get(id=1)
print(data)
print(data.name)
- filter filter_by 过滤 条件
data = UserInfo.query.filter_by(name = "laowang").all()
data = UserInfo.query.filter(UserInfo.name == "laowang").all()
- first()
返回符合条件的第一条数据
返回值对象
如果没有返回值 返回None
data = UserInfo.query.filter(UserInfo.name == 'laowang').first()
- order_by 排序
#升序
data = UserInfo.query.order_by(id).all()
#降序
data = UserInfo.query.order_by(db.desc("id")).all()
data = UserInfo.query.order_by(UserInfo.id.desc()).all()
- 分页
data = UserInfo.query.offset(2).limit(2).all()
##limit(2) 取2条数据 offset(2) 偏移2
- 修改
data = UserInfo.query.filter(UserInfo.id == 1).first()
data.name = "lisi"
db.session.merge(data)
db.session.commit()
- 删除
##delete
data = UserInfo.query.filter(userInfo.id == 2).delete()
db.session.commit()
ORM封装
calss 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 del(self):
db.session.delete(self)
db.session.commit()
使用
class UserInfo(BaseModel):
name = db.Column(db.String(32))
age = db.Column(db.Integer)
userinfo = UserInfo(name="awu",age=19)
# 增加数据
userinfo.save()### 更新数据
userinfo = UserInfo.query.get(8)
userinfo.name="aliu"
userinfo.merge()## 删除数据
userinfo = UserInfo.query.get(8)
userinfo.delete()
ORM跟flask项目的配合使用
flask项目目录优化
上面的代码,将视图和模型写在了一个文档中,在工作中,不能讲模型和视图写在一个文件中个,flask也是遵循MVC的设计模式,是一种解耦合。
main.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os
import pymysql
pymysql.install_as_MySQLdb()app = Flask(__name__)
BASE_DIR = os.path.abspath(os.path.dirname(__file__))##当前文件 项目所在的根目录
print (BASE_DIR)
# "sqlite:tmp/test.db" ###链接sqllit3 配置
# app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + os.path.join(BASE_DIR,"test.db") ##链接sqllit3 配置
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:123123@localhost/flask" ##链接mysql 配置
app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"] = True ### 请求结束之后自动提交
app.config["SQLALCHEMY_RTACK_MODIFICATIONS"] = True ## 跟踪修改 flask 1.x 之后增加的配置项
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True ## 跟踪修改 flask 1.x 之后增加的配置项
app.config["DEBUG"] = True
db = SQLAlchemy(app)
views.py 视图
from flask import render_template
from main import app
from getDate import MyDate@app.route("/index/")
def index():
return render_template("index.html")
@app.route("/userinfo/")
def userinfo():
obj = MyDate()
result = obj.get_date()return render_template("userinfo.html",**locals())
models.py 模型
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))
manage.py 项目控制文件
## 项目的管理文件
## python manage.py runserver
## python manage.py migrate
import sys
from main import app,db
from views import *
from models import *command = sys.argv[1]
### 从终端获取输入的参数
if command == "runserver":
app.run()
elif command == "migrate":
db.create_all()
-
static
-
静态文件 目录
-
-
templates
-
模板文件 目录
-
flask配置文件
第一种 直接编写
应用:比较直观 应用在小型的项目
第二种 编写配置文件
应用:作为默认配置写在文件中农
settings.py
第三种 使用类对象
应用:在项目中使用固定的配置
第四种 使用环境变量
环境变量:操作系统运行环境的时候需要的变量信息
应用场景:配置文件的地址不固定,配置文件私密
在linux中配置export KEY=VALUE