SQLAlchemy使用数据库列名而不是属性nam在模型中设置值

2024-09-27 04:23:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列为TS_TEST_ID的表。我有一个具有以下属性的SQLAlchemy模型:

id = Column(u'TS_TEST_ID', INTEGER(), primary_key=True, nullable=False)

当只有TS_TEST_ID已知时,有没有办法在我的模型类的实例上设置id?也就是说,我只知道数据库中列的名称,我想以某种方式将其映射到id并在我的模型上设置id属性。我本来希望只要做MyModel(**{'TS_TEST_ID':1})就可以了,但是我得到了以下错误:

^{pr2}$

我宁愿不必为模型中的每一列定义TS_TEST_ID = Column(u'TS_TEST_ID', INTEGER(), primary_key=True, nullable=False),甚至不必为返回id属性的TS_TEST_ID方法定义。在


Tags: key模型testidfalsetrue属性定义
2条回答

这似乎比它需要的更复杂,但它是有效的。我希望有一个更直接的方法。。。在

@staticmethod
def fromFieldHash(h):
    row = MyModel()
    cols = list(row.__table__._columns)
    for k, v in h.iteritems():
        col = find(lambda c: c.key == k, cols)
        # See http://www.sqlalchemy.org/trac/wiki/06Migration#AnImportantExpressionLanguageGotcha
        if col is not None:
            prop = row.__mapper__._columntoproperty[col].key
            setattr(row, prop, v)
    return row

我使用的find方法来自Cleanest Python find-in-list function。在

如果希望__init__同时处理属性和列,尽管拥有一个专用的classmethod工厂似乎是一种更干净的方法,但以下实现可以用作抽象基础:

from sqlalchemy import inspect
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


def _create_col_lookup(mapper):
    return {c.name: k for k, c in mapper.columns.items()}


class ColBase(Base):

    __abstract__ = True

    def __init__(self, *args, **kwargs):
        # Create a lookup of column name -> attr key
        ctoa = _create_col_lookup(inspect(self).mapper)

        # Process intersecting keys
        for k in ctoa.keys() & kwargs.keys():
            setattr(self, ctoa[k], kwargs.pop(k))

        super().__init__(*args, **kwargs)

使用上述方法,以下断言通过:

^{pr2}$

相关问题 更多 >

    热门问题