2012-01-10 2 views
1

У меня следующая ситуация:SQLAlchemy с динамическим отображением и сложным объектом, поиском информации

class MyBaseClass(object): 

    def __init__(self, name): 
     self.name = name 
     self.period = None 
     self.foo = None 

    def __getitem__(self, item): 
     return getattr(self, item) 

    def __setitem__(self, item, value): 
     return setattr(self, item, value) 

Если время работы мне нужно добавить некоторые дополнительные столбцы, мы не могли сделать:

my_base_class_table = Table("MyBaseClass", metadata, 
      Column('name', String, primary_key=True), 
      Column('period', DateTime), 
      Column('foo', Float), 
      ) 


my_base_class_table = Table("MyBaseClass", metadata, extend_existing=True) 

column_list = ["value_one", "other_name", "random_XARS123"] 

for col in column_list: 
    my_base_class_table.append_column(Column(col, Float)) 

create_all() 

mapper(MyBaseClass, my_base_class_table) 

Пока здесь мы имеем полнофункциональное отображение динамической таблицы с расширенными столбцами.

Теперь, используя ОРМ в SQLAlchemy в вы можете легко создать экземпляр MyBaseClass и изменить его, чтобы отразить изменения в базе данных:

base_class = MyBaseClass(name="Something") 
base_class.period = "2002-10-01" 

И используя динамические столбцы с неизвестными именами столбцов:

for col in column_list: 
    base_class[col] = 10 

session.add(base_class) 

Но на самом деле , если вы знаете названия колонок:

t_query = session.query(func.strftime('%Y-%m-%d', MyBaseClass.period), 
         func.sum(MyBaseClass.foo), \ 
         func.sum(MyBaseClass.other_name*MyBaseClass.value_one)) 

Можно ли повторить последний запрос (t_query), не зная названия столбцов? Я уже пробовал разные случаи не повезло:

func.sum(MyBaseClass[column_list[0]]*MyBaseClass.[column_list[1]]) 

Единственное, что на самом деле работа делает расширенный текст SQL, как:

text_query = text("SELECT strftime('%Y-%m-%d', period) as period, sum(foo) as foo, sum({0}*{1}) as bar FROM {2} ".format(column_list[0], column_list[1], "MyBaseClass") 

ответ

1

Простой getattr будет делать трюк:

t_query = session.query(func.strftime('%Y-%m-%d', getattr(MyBaseClass, "period")), 
         func.sum(getattr(MyBaseClass, "foo")), 
         func.sum(getattr(MyBaseClass, "other_name") * getattr(MyBaseClass, "value_one")) 
         ) 
+0

Вау! достаточно простой, чем x! – konus

Смежные вопросы