2015-10-09 2 views
0

У меня есть база данных, которую мы используем для всех наших клиентов. Каждый клиент имеет набор таблиц, оканчивается с их клиентами ID:Использование сопоставлений SQLAlchemy с таблицами вариантов

  • analytics_123
  • embeds_123
  • downloads_123

Он устанавливается с "ручным" заявлением SQL, но я предпринимаю попытка переместить его в SQLAlchemy для упрощения обслуживания.

Я бы предпочел использовать декларативный синтаксис, но есть ли способ динамически установить значение __tablename__ модели? И что произойдет, если мне нужно получить доступ к нескольким клиентам в потоковой среде (мы, скорее всего, будем использовать разные процессы, но на всякий случай я бы скорее накрыл его фронт).

Помимо самого имени табуляции, все отношения (простые внешние ключи с одним ключом) также должны отображаться правильно между таблицами.

+0

Вместо постфиксных таблиц рассмотрим использование отдельных баз данных или схем. –

ответ

2

Один из подходов заключается в изготовлении всех классов, которые требуются для клиента. Что-то вроде следующего ... (это всего лишь эскиз!)

class customer_classes: 
    # create the base class 
    base = declarative_base(metadata=metadata) 

    def __init__(self, metadata, customer_id): 

     class analytics(self.base): 
      __tablename__ = 'analytics_{}'.format(customer_id) 
      __mapper_args__ = ... 

     class embeds(self.base): 
      __tablename__ = 'analytics_{}'.format(customer_id) 
      __mapper_args__ = ... 

     class downloads(self.base): 
      __tablename__ = 'analytics_{}'.format(customer_id) 
      __mapper_args__ = ... 

     # now lets assign all these classes to attributes 
     import inspect 
     defined_classes = [cls for cls in locals().values() 
          if inspect.isclass(cls) and issubclass(cls, base)] 
     self.__dict__.update({cls.__name__: cls for cls in defined_classes}) 

# now we can create a set of classes for customer 123 
customer_model = customer_classes(123) 
session.query(customer_model. analytics).all() 

# you can just as easily work with another customer at the same time in the same session 
another_model = customer_classes(456) 
session.query(another_model.analytics).all() 
+0

Спасибо за ввод - не на 100% уверен, что я буду использовать эту точную модель, но что-то в этом роде. –

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