Python一些可能用的到的函数系列8 使用Jinja生成sqlalchemy数据对象

本文探讨了传统硬编码方式编写代码存在的问题,如易出错且难以确保无bug。提出了一种通过配置编程的方法,特别是利用Jinja模板来动态生成Python代码。通过一个具体的例子,展示了如何用Python程序结合Jinja2模板生成数据库模型类的代码,从而减少了手动编写时可能出现的错误。这种方法允许在运行时根据变量生成代码,提高了灵活性和准确性。
摘要由CSDN通过智能技术生成

说明

人写代码总有bug

传统的写代码方式是hardcode。即由人按照程序语言进行编写,然后语言的组件进行编译/解释,交给机器执行。任何一种语言,也包括python,没有办法完美表达人的意思(这意味着表达方式可能不人性化);另外就是机器不接受错别字。
所以手工编写代码错误的概率很好,即便经过多次调试仍然不能保证无错。这就是code by man。

code by code by man 其实指的是人通过工具间接的编程。

除去一些产品之外(例如拖拽编程之类的,那也不是最优方式),其实比较常见的方式是通过配置编程。
总体上我觉得比较清晰的有两种:

1 通过配置
2 通过程序生成代码

配置的方式这里不谈,有兴趣可以看我的另一篇文章
我认为通过jinja生成py文件算是通过程序生成代码。(如果和subprocess配合起来,是可以在运行中产生代码再执行的)

1 j2文件

datamodel.j2

class {{classname}}(db.Model):
    __tablename__='{{classname|lower}}'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))
    {%for str_var in str_var_list%}{{str_var}}= db.Column(db.String(32))
    {%endfor%}
    {%for num_var in num_var_list%}{{num_var}}= db.Column(db.Float(precision=2))
    {%endfor%}
    {%for dt_var in dt_var_list%}{{dt_var}}= db.Column(db.DateTime())
    {%endfor%}    

2 python程序

test1.py

import DataManipulation as dm 

# 不传空列表模板知识不处理,不会出错
str_var_list = ['a', 'b', 'c']
num_var_list = ['d1','d2','d3']
dt_var_list =['dt1','dt2']
content = dm.gen_by_j2(template_name='datamodel.j2', classname='Base8v2', str_var_list=str_var_list, num_var_list=num_var_list, dt_var_list=dt_var_list)

with open('tem.py', 'w') as f:
    f.write(content)

3 生成的结果

tem.py

class Base8v2(db.Model):
    __tablename__='base8v2'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))
    a= db.Column(db.String(32))
    b= db.Column(db.String(32))
    c= db.Column(db.String(32))
    
    d1= db.Column(db.Float(precision=2))
    d2= db.Column(db.Float(precision=2))
    d3= db.Column(db.Float(precision=2))
    
    dt1= db.Column(db.DateTime())
    dt2= db.Column(db.DateTime())

4 总结

通过jinja循环,只要在python程序里将变量进行分类,然后把变量列表送入j2文件里就可以生成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值