У меня следующая ситуация: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")
Вау! достаточно простой, чем x! – konus