Flask(二):flask数据库操作+ORM封装+flask配置文件编写规则

flask数据库操作

django中使用ORM连接操作数据库

python使用pymysql链接数操作数据库,flask中也可以使用pymysql链接

sqlalchemy:python的开源的ORM框架

flask-sqlalchemy

对sqlalchemy进行封装

安装

pip install falsk-sqlalchemy

pip intall pymysql

官方文档

http://www.pythondoc.com/flask-sqlalchemy/config.html#uri

使用

链接数据库

sqllist3

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os

app = 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值