Skip to main content
 首页 » 编程设计

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

2025年05月04日10shanyou

我正在尝试使用 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 
        }) 

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

请您参考如下方法:

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