SQLalchemy ORM添加到动态列

时间:2016-12-13 16:03:40

标签: python sqlalchemy

我有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,但TableMeaningENmeaningTableReadingONreading

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

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'))

我试过这个,但不允许这样做。

1 个答案:

答案 0 :(得分:1)

如果表只是一个属性真的不同,你可以为两者创建一个构造函数,它也采用位置参数,例如:

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))