【python轻量级中台框架开发第一层】 ORM flask-sqlacodegen 两种模式

【python轻量级中台框架开发第一层】 ORM flask-sqlacodegen 两种模式

提示:【python轻量级中台框架开发第一层】 ORM flask-sqlacodegen


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

python轻量级中台框架开发是从业多年开始研究的第二类框架,此前使用donet core3.1 开发的 跳动数字-jump 微服务框架,由于多种原因并未开源,此次使用python-flask框架开发的轻量级框架考虑开源,希望想一起学习的网友一起指正点评。


提示:以下是本篇文章正文内容,下面案例可供参考

一、ORM是什么?

ORM是对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping)
它解决了对象和关系型数据库之间的数据交互问题。

二、使用flask-sqlacodegen生成对象映射关系

方法1.已经建好数据库==>模型生成:使用系统管理员启动命令行工具

键入如下命令(示例):

flask-sqlacodegen "mysql://root:root@localhost:3306/douyin" 
--outfile "dbModel.py" 
--flask

flask-sqlacodegen mysql数据的连接串
–outfile 输出文件路径 绝对路径
–flask 选项支持flask sqlalchemy语法。

方法2.模型迁移到数据库中生成表,codefirst:使用flask-migrate:

需要安装依赖库:

flask_migrate
pip install flask_migrate=2.5.3

flask_script
pip install flask_script=2.0.6

代码如下 :

apps.py 程序入口代码

from flask import Flask
from exts import db


def create_app():
    app = Flask(__name__)
    app.config.from_object('config')  # 使用模块的名字
    db.init_app(app)
    return app


if __name__ == '__main__':
    app = create_app()
    app.run(host='127.0.0.1', port=8000, debug=True)

config.py 配置代码

#encoding:utf-8
import os
ADMIN_USER_ID = 'XXX'
MEMBER_USER_ID='XXX'
SECRET_KEY = os.urandom(24)
DEBUG=True
DB_USERNAME = 'root'
DB_PASSWORD = '28320071'
DB_HOST = '127.0.0.1'
DB_PORT = '3306'
DB_NAME = 'douyin'
DB_URI = 'mysql+pymysql://%s:%s@%s:%s/%s?charset=utf8' % (DB_USERNAME,DB_PASSWORD,DB_HOST,DB_PORT,DB_NAME)
SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_ECHO= False
WTF_CSRF_ENABLED = False#关闭CSRF保护
#上传到本地
UEDITOR_UPLOAD_PATH = os.path.join(os.path.dirname(__file__),'static','images')

exts.py 配置代码

# encoding:utf-8
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

—这里只贴出models的部分代码。其他的数据库依次类推可以分不同模块导入。

models.py 迁移模型代码

提示:这里要说下迁移模型自己手动编写,类似概念模型但需要遵循方言使用的类型:

# encoding:utf-8
from exts import db
 
class Users(db.Model):
    __tablename__ = 'tbuser'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    receiver_name = db.Column(db.String(100))  # 用户名
    receiver_province = db.Column(db.String(100))  # 省
    receiver_city = db.Column(db.String(100))  # 市
    receiver_district = db.Column(db.String(100))  # 县
    receiver_address = db.Column(db.String(500))  # 地址
    receiver_mobile = db.Column(db.String(100))  # 电话
 

    def __init__(self, username, password, email):
        self.username = username
        self.password = password
        self.email = email


—最后是manager.py 这个Manager接收migrate更新数据库指令。

manager.py 生成数据库代码

注:如果仅仅是定义类Model,直接命令更新数据库是不会更新的,需要运行时有调用到才会有效,引入(from app.models.Tag import Tag)该类后再执行更新指令才能更新成功。
注:在flask2.0 以上版本flask_script这个引用会一直飘红,解决方法我写在最后。

from flask_migrate import Migrate, MigrateCommand
from exts import db
from flask_script import Manager
from apps import create_app
import ConceptModel.admin.models #引入models库
 
app = create_app()
manager = Manager(app)
Migrate(app, db)
manager.add_command('db', MigrateCommand)

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

好了,manager编写完了,那么如何生成Migrate?
初始化Migrate,只需要在终端输入两条命令:

python manager.py db init

python manager.py db migrate
完成后项目中会多出来一个 Migrate文件夹里面就是生成的指令库。

python manager.py db upgrade
执行生成数据库指令

终端输入执行升级数据库指令:python manager.py db upgrade,当然你也可以根据工程根目录下migrations目录中的不同版本降级更新数据库:python manager.py db downgrade

总结

提示:这里对文章进行总结:

好了,到这里flask-sqlacodegen 生成数据库的两种方式都说完了,你们觉得那种更适用。
对于个人小项目我推荐使用第一种方法。对于商用或更广泛应用个人推荐使用code-first方式。因地制宜根据不同场景自行选择感谢阅读,本人会持续更新轻量级中台框架不断加入新的模块,未完待续。。。。

flask2.0以上版本 flask_script 会报出一个错误

原因:
可能是更新了Flask2.0以上版本问题,导致Flask._compat的目录发生变化。
解决方法 1 :

使用如下命令降级:

pip install “Flask==1.1.4”

解决方法 2:

不降级修改原代码flask_script/init.py中from flask._compat import text_type 改成 from flask_script._compat import text_type

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@农垦专家

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值