首页 > 数据库 >flask使用sqlalchemy

flask使用sqlalchemy

时间:2023-04-12 18:55:38浏览次数:48  
标签:__ sqlalchemy name flask app db SQLALCHEMY 使用

flask使用sqlalchemy

flask-sqlalchemy集成方案

借助第三方模块flask-sqlalchemy,可以将sqlalchemy快速的集成到flask项目中。

pip install flask_sqlalchemy


from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()  # 产生一个SQLAlchemy对象

# 将db注册到app中
db.init_app(app)

# 视图函数中使用会话session,直接导入db即是线程安全的
db.session

# models.py中继承的declarative_base对象,被单例到db.Model中
class 表模型(db.Model):...

# 各种字段类型被集成到db中
db.Column(db.String(80), unique=True, nullable=False)
db.Column(db.Integer, db.ForeignKey("team.id"))

# 引擎的配置也可以直接在app中直接加,那么我们就不用自己创建引擎了,上述的session等也就基于此引擎生成
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://[email protected]:3306/ddd?charset=utf8"
SQLALCHEMY_POOL_SIZE = 5
SQLALCHEMY_POOL_TIMEOUT = 30
SQLALCHEMY_POOL_RECYCLE = -1
# 追踪对象的修改并且发送信号
SQLALCHEMY_TRACK_MODIFICATIONS = False

flask-migrate迁移表

我们通过sqlalchemy模块的declarative_base对象.metadata.create_all(engine)等代码方法,才能将表同步到数据库,并且也不支持修改表的字段,flask-migrate模块支持我们通过脚本命令的形式来同步表设计。

而这个模块依赖 flask-script 模块,以下是一种版本兼容的版本设置

flask2.2.2、flask-script2.0.3、flask-migrate==2.7.0

# 安装好相关依赖后,需要在启动文件中:
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
manager = Manager(app)
Migrate(app, db)
manager.add_command('db', MigrateCommand) # 使用db相关指令迁移表

manager.run() # 使用python manage.py runserver 启动项目

迁移指令:

python manage.py db init   # 生成迁移文件夹,只需要建立项目时执行一次即可
python manage.py db migrate   # 记录表模型的变化
python manage.py db upgrade  # 将迁移记录同步到数据库

结合以上的flask项目

我们如果想整一个按命令启动的,可以迁移数据库的flask项目,可以参考以下的文件写法来拓展:

### manage.py
from flask import Flask
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from models import db

app = Flask(__name__)
app.config.from_object('settings.DevSettings')  # 初始数据库引擎前先导入配置
db.init_app(app)  # 按app将db初始化,创建引擎

manager = Manager(app)
Migrate(app, db)
manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
    manager.run()

    
### models.py
from flask_sqlalchemy import SQLAlchemy
import datetime

db = SQLAlchemy()  # 产生一个db管理表模型


class User(db.Model):
    # 第四步:写字段
    id = db.Column(db.Integer, primary_key=True)  # 生成一列,类型是Integer,主键
    name = db.Column(db.String(32), index=True, nullable=False)  # name列varchar32,索引,不可为空
    email = db.Column(db.String(32), unique=True)
    # datetime.datetime.now不能加括号,加了括号,以后永远是当前时间
    ctime = db.Column(db.DateTime, default=datetime.datetime.now)
    # extra = Column(Text, nullable=True)

    # 第五步:写表名 如果不写以类名为表名
    __tablename__ = 'users'  # 数据库表名称

    # 第六步:建立联合索引,联合唯一
    __table_args__ = (
        db.UniqueConstraint('id', 'name', name='uix_id_name'),  # 联合唯一
        db.Index('ix_id_name', 'name', 'email'),  # 索引
    )


class Book(db.Model):
    __tablename__ = 'books'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))


### settings.py
class SettingBase:
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:[email protected]:3306/ddd?charset=utf8"
    SQLALCHEMY_POOL_SIZE = 5
    SQLALCHEMY_POOL_TIMEOUT = 30
    SQLALCHEMY_POOL_RECYCLE = -1
    # 追踪对象的修改并且发送信号
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    Debug = True


class DevSettings(SettingBase):
    Debug = False

标签:__,sqlalchemy,name,flask,app,db,SQLALCHEMY,使用
From: https://www.cnblogs.com/Leethon-lizhilog/p/17310826.html

相关文章

  • 针对form 表单 只有一个输入框的时候 使用回车查询会刷新页面问题
    <el-form:model="queryParams"ref="queryForm" :inline="true"v-show="showSearch"label-width="68px"@submit.native.prevent>   <el-form-itemlabel="表单名"prop="name">......
  • 记录-vue项目中使用PWA
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前言:梳理了一下项目中的PWA的相关用法,下面我会正对vue2和vue3的用法进行一些教程示例,引入离线缓存机制,即使你断网,也能访问页面。一旦用户访问了我们的网页,我们就像牛皮糖一样粘连着他,他永远都可以访问,即使断网也能......
  • web前端tips:使用 forEach 循环中的 return 语句会发生什么?
    近日,笔者在认真搬砖的过程中,突然遇到一个问题,请看大屏幕(代码):data(){return{statusList:[{code:"1",name:"已保存"},{code:"2",name:"已提交"}]......
  • VUE中的插槽使用详解
     <!--什么是插槽?  *插槽就是子组件中的提供给父组件使用的一个占位符,插槽显不显示、怎样显示是由父组件来控制的,而插槽在哪里显示就由子组件来进行控制。  一般用slot标签来表示插槽要渲染的位置,slot的用法可以分为三类,分别是默认插槽、具名插槽、作用域插槽 ......
  • FastReport 使用笔记
    FastReport使用笔记1.在脚本中使用变量在Script脚本方法中中定义变量和Delphi一样,不做说明,这里主要说一下在报表中定义的变量如何在脚本中读写:(1)定义变量类型vars在vars类别下增加变量v1在Memo1上使用memo1.text:=[v1]在Script中读取get('v1')或者在Script......
  • springboot filter 和 interceptor 使用
    userholderpublicclassUserHolder{privatestaticThreadLocal<String>userThreadLocal=newThreadLocal<>();//为当前的线程变量赋值上用户信息publicstaticvoidsetLoginUser(Stringuser){userThreadLocal.set(user);}//从当前......
  • ImGui 简单使用
    主窗口......
  • Centos使用经验
    安装最小的镜像文件http://mirrors.163.com/centos/6/isos/x86_64/CentOS-6.10-x86_64-minimal.iso 此映像的目的是安装一个非常基本的CentOS6.10系统,并使用具有功能性系统所需的最少软件包。请将此映像刻录到CD上,然后从计算机启动计算机。一组预选的软件包将安装在您的系统上......
  • uos使用记录
    1安装nginx报错isunland@isunland:~/Desktop$sudoaptinstallnginx请输入密码:验证成功正在读取软件包列表...完成正在分析软件包的依赖关系树正在读取状态信息...完成E:无法定位软件包nginx解决:isunland@isunland:~/Desktop$sudoapt-getupdat......
  • mysql 使用分区partition_name 作为条件查询
       SELECT*FROMmy_tablePARTITION(partition_name)WHEREcolumn_name='value';```将`my_table`替换为您的表名,将`partition_name`替换为您要查询的分区的名称,将`column_name`替换为您要用作条件的列的名称,将`'value'`替换为您要用作过滤器的值。......