Динамически настраивать __tablename__ для sharding в SQLAlchemy?

Чтобы обрабатывать растущую таблицу базы данных, мы опираемся на имя таблицы. Таким образом, мы могли бы иметь таблицы базы данных, которые называются так:

table_md5one table_md5two table_md5three 

Все таблицы имеют ту же схему.

Как мы используем SQLAlchemy и динамически указываем имя_таблицы для класса, который соответствует этому? Похоже, что для классов declarative_base () необходимо предварительно указать имя табуляции .

В конечном итоге будет слишком много таблиц, чтобы вручную определять производные классы из родительского / базового класса. Мы хотим иметь возможность создавать класс, который может иметь динамическое создание tablename (может быть передано как параметр функции).

5 Solutions collect form web for “Динамически настраивать __tablename__ для sharding в SQLAlchemy?”

Хорошо, мы пошли с пользовательским объявлением SQLAlchemy, а не с декларативным.

Поэтому мы создаем динамический объект таблицы следующим образом:

 from sqlalchemy import MetaData, Table, Column def get_table_object(self, md5hash): metadata = MetaData() table_name = 'table_' + md5hash table_object = Table(table_name, metadata, Column('Column1', DATE, nullable=False), Column('Column2', DATE, nullable=False) ) clear_mappers() mapper(ActualTableObject, table_object) return ActualTableObject 

Где ActualTableObject – это сопоставление классов с таблицей.

В дополнении базы вы найдете способ использования настраиваемого Base класса, который может, например, вычислять __tablename__ __tablename__ динамически:

 class Base(object): @declared_attr def __tablename__(cls): return cls.__name__.lower() 

Единственная проблема здесь в том, что я не знаю, откуда происходит ваш хеш, но это должно стать хорошей отправной точкой.

Если вам нужен этот алгоритм не для всех ваших таблиц, но только для одного, вы можете просто использовать declared_attr в таблице, который вас интересует осколками.

Попробуй это

 import zlib from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, BigInteger, DateTime, String from datetime import datetime BASE = declarative_base() ENTITY_CLASS_DICT = {} class AbsShardingClass(BASE): __abstract__ = True def get_class_name_and_table_name(hashid): return 'ShardingClass%s' % hashid, 'sharding_class_%s' % hashid def get_sharding_entity_class(hashid): """ @param hashid: hashid @type hashid: int @rtype AbsClientUserAuth """ if hashid not in ENTITY_CLASS_DICT: class_name, table_name = get_class_name_and_table_name(hashid) cls = type(class_name, (AbsShardingClass,), {'__tablename__': table_name}) ENTITY_CLASS_DICT[hashid] = cls return ENTITY_CLASS_DICT[hashid] cls = get_sharding_entity_class(1) print session.query(cls).get(100) 

вы можете написать функцию с параметром tablename и отправить класс обратно с настройкой соответствующих атрибутов.

 def get_class(table_name): class GenericTable(Base): __tablename__ = table_name ID= Column(types.Integer, primary_key=True) def funcation(self): ...... return GenericTable 

У меня был такой же вопрос. Решение, упомянутое Суманом, отлично работает. Затем я также пробовал метод создания динамического класса, который, я думаю, хорош. К моему удивлению, производительность намного худшая (в 5 раз медленнее) по сравнению с обычным методом объявления SQLAlchemy, с 2000 таблицами с менее чем 10 000 короткими записями в моем старом окне Linux. Я тоже запустил метод Арда. Но если кто-то знает причину разницы в производительности, отправьте его.

  • Каков хороший общий способ просмотра транзакций SQLAlchemy, в комплекте с аутентифицированным пользователем и т. Д.?
  • Flask-SQLAlchemy create_all ()
  • sqlalchemy Перемещение столбцов mixin до конца
  • Какова ваша папка для приложения Flask, разделенная на модули?
  • Как создать ENUM в SQLAlchemy?
  • SQLAlchemy INSERT IGNORE
  • Обновление таблицы из другой таблицы с несколькими столбцами в sqlalchemy
  • Когда мне нужно использовать sqlalchemy back_populates?
  • Python - лучший язык программирования в мире.