问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

请问,flask-sqlalchemy 怎么动态创建数据表?

发布网友 发布时间:2022-04-08 01:42

我来回答

2个回答

懂视网 时间:2022-04-08 06:03

class GoodsDesc(db.Model):
 __tablename__ = ‘goods_desc‘

 goods_id = db.Column(db.Integer, primary_key=True)
 goods_desc = db.Column(db.Text, default=None)

 def __str__(self):
 return "GoodsDesc => { goods_id:%d, goods_desc:‘%s‘}" % (
self.goods_id, self.goods_desc)

 __repr__ = __str__

# 代码示例
goods_id = 101
table_index = goods_id%2
table_name = ‘goods_desc_%d‘ % table_index
GoodsDesc.__table__.name = table_name
gd = GoodsDesc.query.filter(GoodsDesc.goods_id == goods_id).first()

# 这样写虽然也能工作,但是是非常危险的,因为GoodsDesc.__table__是静态全局变量,
# 而且不是web程序request级别的,是app context的,非常不安全。

经过N次Google,终于找到解决方案,而且代码写起来也很优雅。代码如下:

class GoodsDesc(object):

 _mapper = {}

 @staticmethod
 def model(goods_id):
 table_index = goods_id%100
 class_name = ‘GoodsDesc_%d‘ % table_index

 ModelClass = GoodsDesc._mapper.get(class_name, None)
 if ModelClass is None:
  ModelClass = type(class_name, (db.Model,), {
  ‘__module__‘ : __name__,
  ‘__name__‘ : class_name,
  ‘__tablename__‘ : ‘goods_desc_%d‘ % table_index,

  ‘goods_id‘ : db.Column(db.Integer, primary_key=True),
  ‘goods_desc‘ : db.Column(db.Text, default=None),
  })
  GoodsDesc._mapper[class_name] = ModelClass

 cls = ModelClass()
 cls.goods_id = goods_id
 return cls

# 外部代码调用如例如下:
# -----------------------

# 新增插入
gdm = GoodsDesc.model(goods_id)
gdm.goods_desc = ‘desc‘
db.session.add(gd)

# 查询
gdm = GoodsDesc.model(goods_id)
gd = gdm.query.filter_by(goods_id=goods_id).first()
 

flask-sqlalchemy分表解决方案

标签:

热心网友 时间:2022-04-08 03:11

首先你需要动态地创建一个表结构:
tb_name = 'tb_test'
pk_col = db.Column('tid', db.Integer, primary_key=True, autoincrement=True)
name_col = db.Column('name', db.String(32), nullable=False)
...
tb = db.Table(tb_name, db.metadata, pk_col, name_col, ...)

然后在数据库中创建这个表:
db.metadata.create_all(bind=db.engine, tables=[tb])

如果你想要有一个Model的话,可以将一个类和table映射一下:
# 根据tb_name构造一个类名
class_name = tb_name.title().replace('_', '') + 'Model'
# 创建类
TbTestModel = type(class_name, (object,), {
'__init__': lambda self, name: setattr(self, 'name', name)
})
# 对应的硬编码
# class TbTestModel(object):
# def __init__(self, name):
# self.name = name
db.mapper(TbTestModel, tb)
TbTestModel.query = db.session.query(TbTestModel)

然后就可以愉快地使用TbTestModel进行查询了:
test = TbTestModel('Tom')
db.session.add(test)
db.session.commit()
TbTestModel.query.filter(TbTestModel.name == 'Tom').first()
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 登陆是指什么? 重大疾病保险原位癌 怎么登录 用登录微信要怎么登录?用!不知道密码怎样登录 怎么登上 为什么我的登上去不是我原来的号 原位癌 怎么解释 用可以登录微信吗 用怎么登陆微信? 原位癌是指什么? 怎么登录微信 重疾保险中关于原位癌是怎么定义的 如何用登录微信 怎么登 怎么用登录微信 微信无手机号无密码,只有怎么登录? 用手机看新闻联播用哪个软件 如何用登录微信?- 问一问 海鲜蛏子怎么做好吃 微信公众号怎么能在单图文里多加视频5-10个视频就行 为什么重疾不赔原位癌 用登微信要怎么登? 重疾险赔付原位癌吗? 如何用登录微信? 专家解析:原位癌是指什么不赔付? 香港中国人寿重疾险的原位癌定义是怎样 鸿钧老祖是封神榜里杜撰还是道教里真实存在的 鸿钧老祖在《封神演义》之前,有没有出现在道教典籍和文学作品中? 鸿钧是封神榜编出来的人物吗?还是道家本来就有鸿钧这号人物 《封神演义》中,鸿钧老祖的势力范围究竟有多大? “则”字是什么意思 则 字是什么意思?表什么关系? 则什么意思 古代中,则是什么意思? 寓言的则是什么意思 声卡套装 手机全民k歌怎么用声卡 学而不思则罔中,则是什么意思 则是啥意思 有什么可以借款的软件 借钱软件都有什么