SQLalchemy:将列映射到不同的属性

时间:2011-02-15 17:26:58

标签: python orm sqlalchemy

我正在尝试使用sqlalchemy存储一些模拟测量值(时间和值)。以下是相关的表定义。如果有一个更明智的表格定义,我很乐意看到它。

from sqlalchemy import create_engine, schema, orm

engine = create_engine('sqlite:///:memory:', echo=True)
metadata = schema.MetaData(bind=engine)

container_table = schema.Table('containers', metadata,
        schema.Column('id', schema.types.Integer, primary_key=True))

measurement_table = schema.Table('measurements', metadata,
        schema.Column('id', schema.types.Integer, primary_key=True),
        schema.Column('container_id', schema.types.Integer,
                      schema.ForeignKey('containers.id')),
        schema.Column('time',  schema.types.Float),
        schema.Column('value', schema.types.Float))

metadata.create_all()

每个容器的时间都是唯一的,下面的属性应按时间排序。

我希望能够同时阅读和分配这些属性:

c = Container()

times  = range(10)
values = [t**2 for t in times]

c.times  = times
c.values = values

但我不知道如何进行映射。我假设如果可能,它看起来像这样:

class Container(object):
    times  = some_sort_of_proxy()
    values = some_sort_of_proxy()

orm.mapper(Container, container_table, properties={
        # Magic
        })

我该怎么做呢?这是一个合理的映射,还是我需要一个不同的基础表结构?

1 个答案:

答案 0 :(得分:1)

class EmailAddress(object):

    @property
    def email(self):
        return self._email

    @email.setter
    def email(self, email):
        self._email = email

mapper(EmailAddress, addresses_table, properties={
    '_email': addresses_table.c.email
})