繁体   English   中英

SQLalchemy ORM添加到带有动态列的会话

[英]SQLalchemy ORM add to session with dynamic column

我有2个表(不是数据库的真实设置)。

tableclass.py:

class TableMeaningEN(sqla_base):
    __tablename__ = 'MeaningEN'

    id = sqla.Column(sqla.Integer, primary_key=True)
    meaning = sqla.Column(sqla.String, primary_key=True)

class TableReadingON(sqla_base):
    __tablename__ = 'ReadingON'

    id = sqla.Column(sqla.Integer, primary_key=True)
    reading = sqla.Column(sqla.String, primary_key=True)

不同的列名

如您所见,两者都有列id ,但是TableMeaningEN具有meaningTableReadingON具有reading

通常(假设您已经有一个会话),您将添加以下内容:

session.add(TableMeaningEN(id=1, meaning='test'))

但是我想向表中动态添加条目,所以我有:

import tableclass as tc
for t_name in ['MeaningEN', 'ReadingON']:
    session.add(getattr(tc, 'Table{}'.format(t_name))(id=1, ??='test'))

我该如何解决这个问题?? 是在一个表meaning ,并在其他reading

尝试过:

columns = sqla.inspect(getattr(tc, 'Table{}'.format(overwrite))).columns.keys()
session.add(getattr(tc, 'Table{}'.format(t_name))(id=1, columns[1]='test'))

我试过了,但是那是不允许的。

如果表实际上只是一个属性而不同,则可以为两个表创建一个构造函数,该构造函数也接受位置参数,例如:

class TableMeaningEN(sqla_base):
    def __init__(self, id, meaning):
        self.id, self.meaning = id, meaning

# similar __init__ for the other class/table

# then use the following:
session.add(getattr(tc, 'Table{}'.format(t_name))(1, 'test'))

一种替代方法是,假设存在命名约定,则动态创建关键字参数:

import tableclass as tc

for t_name in ['MeaningEN', 'ReadingON']:
    cls = getattr(tc, 'Table{}'.format(t_name))
    fld_name = t_name.lower()[:-2]
    kw = {'id': 1, fld_name: 'test'}
    session.add(cls(**kw))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM