头图

如何编写一个 Python Web 应用 (二):Flask-SQLAlchemy

最近我在为 openEuler 社区添加一个 FAQ 模块, 这一系列正是我在这一过程中的总结

全部内容: 如何编写一个 Python Web 应用(零)


简单增删改查

参考:

复杂关系: 一对一, 一对多

在 Mybatis 中, 实现一对多和一堆一, 需要在 .xml 文件或 @Select 注解中生命映射, 但咱 SQLAlchemy 中, 只需要一个参数.

这是一个例子. 这里 EQuestionEQuestionDescription 是一对多的关系.

/models.py:

from faq import db


class EQuestion(db.Model):
    __tablename__ = 'e_question'

    id = db.Column(db.String(20), primary_key=True)
    std_description = db.Column(db.String(250), unique=True)


class EQuestionDescription(db.Model):
    __tablename__ = 'e_question_description'

    id = db.Column(db.String(20), primary_key=True)
    description = db.Column(db.String(200), nullable=False)
    question_id = db.Column(db.ForeignKey('e_question.id'), index=True)

    question = db.relationship('EQuestion', backref='e_question_descriptions', primaryjoin='EQuestionDescription.question_id == EQuestion.id')

只需要在 "一对多" 中 "多" 的一方加入:

question = db.relationship('EQuestion', backref='e_question_descriptions', primaryjoin='EQuestionDescription.question_id == EQuestion.id')

接下来, 编写一个 CLI COmmand 来测试一下:

@app.cli.command('hello')
def hello():
    question: EQuestion = EQuestion.query.get('2')
    print(question)
    
    descriptions = question.e_question_descriptions
    print(descriptions)
    
    description: EQuestionDescription = descriptions[0]
    print(description)
    
    question: EQuestion = description.question
    print(question)

结果:

PS D:\my\flask\app> flask hello
<EQuestion 2>
[<EQuestionDescription 3>, <EQuestionDescription 9>]
<EQuestionDescription 3>
<EQuestion 2>

使用 sqlacodegen 实现针对 SQLAlchemy 的逆向工程

这里只是介绍这个有力的工具:

参考: flask 插件 flask-sqlacodegen

需要注意的是, 由 flask-sqlacodegen 直接生成的代码并不能直接适应我们原有的代码

下面是在 PowerShell 中完整的生成命令. 他将在当前目录中生成一个 models.py 文件

PS D:\my\flask\app> (.\venv\Scripts\Activate.ps1) ;((flask-sqlacodegen mysql://root:123456@localhost:3306/openeuler_faq --flask) -replace 'db = SQLAlchemy\(\)','from faq import db' -replace 'from flask_sqlalchemy import SQLAlchemy','' | out-file faq/models.py -encoding utf8)

关于这一命令的含义, 我将在最后一节详谈

不想单纯只会编码。。

4 声望
1 粉丝
0 条评论
推荐阅读
【CS 285 DRL Homework 2】Policy Gradients 策略优化
主要的训练算法集中在 RL_Trainer.run_training_loop 中。通过观察一个循环(iteration)的调用过程,可总结为:

Petrickstar阅读 597

iOS IDA逆向之patch
这里介绍的是ida的patch.1.搜索svc #0x80,回到IDA View-A界面,才能正确搜索点击图中T字按钮,弹出搜索框点击列表中进入2.修改svc #0x80,在IDA View-A界面中选中svc那一行,点击工具栏Edit--&gt;Patch program--&gt...

宋冬野阅读 2k

某乎搜索接口zse96参数逆向分析【2022.11版本】
1.首先找到接口路径是/api/v4/search_v3,其中看起来有点莫名其妙的是x-ab-pb,x-zse-96,x-zst-81这三个参数;去掉x-ab-pb参数,接口正常;去掉x-zst-81参数,接口报错;去掉x-zse-96参数,接口报错。2.首次进入页...

气势凌人的帽子3阅读 1.4k评论 3

frida-rpc实现某一短视频刷邀请
之前发过一篇文章,app升级算法之后还没来得及更新,文章就被举报404了,悲哀,今天更新写一下新版,这里就不贴源码了,文章最后放github,需要自取,我看老六还怎么举报。

二毛erma0阅读 838评论 1

node.js基于 cmake-js 进行插件开发实战
以前工作在node.js环境下,做微服务产品; 三年前转回到C++环境,已经有一些代码积攒。我将以往基于node.js与C++的相关项目结合起来(C++代码以addon插件嵌入),实现了一个微服务快速(rest api service)开发框...

zhoutk阅读 788

mybatis源码笔记
目录开撕MyBatis源码1. 手写持久层框架-ipersistent1.1 JDBC操作数据库\_问题分析1.2 JDBC问题分析&解决思路1.3 自定义持久层框架\_思路分析使用JDBC和使用持久层框架区别:框架,除了思考本身的工程设计,还需要...

eacape阅读 481

封面图
【iOS逆向与安全】frida-trace入门
frida-trace是一个用于动态跟踪函数调用的工具。支持android和ios。安装教程请参考官网。工欲善其事必先利其器。本文将以某App为示范,演示frida-trace的各种方法在iOS中的应用。

小陈阅读 394

不想单纯只会编码。。

4 声望
1 粉丝
宣传栏