Понимание того, как выполнить массовую вставку «многие ко многим» с помощью PeeWee ORMPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Понимание того, как выполнить массовую вставку «многие ко многим» с помощью PeeWee ORM

Сообщение Anonymous »

Я разработчик C#, пытающийся решить проблему с Python, пожалуйста, потерпите мои непитонические методы.
Я пытаюсь понять, как реализовать массовую вставку в сценарии отношений «многие ко многим» для создания сокращенной аналитической базы данных (на данный момент с использованием SQLite3) при нормализации повторяющихся данных. Вот соответствующие классы модели:

Код: Выделить всё

class BaseModel(Model):
class Meta:
database = ServiceLocator().getDatabase()
legacy_table_names=False

class LogEntry(BaseModel):
Id = AutoField()
Level = ForeignKeyField(Level)
File = ForeignKeyField(File, on_delete='CASCADE')
Host = ForeignKeyField(Host)
Date = DateTimeField()
Contents = ManyToManyField(ContentDetail, backref="Entries")
LineNumber = IntegerField()

class ContentDetail(BaseModel):
Id = AutoField()
PropertyName = TextField(index=True)
PropertyValue = TextField(null=True,  default=None)
ValueSizeInBytes = BigIntegerField()
а вот небольшая конфигурация для сопоставления таблицы отношений start.py:

Код: Выделить всё

def main() -> None:
locator = ServiceLocator()
logger = locator.getLogger()

try:
with locator.getDatabase() as db:
ContentDetailLogEntry = LogEntry.Contents.get_through_model() #
[code](propName:str, propVal:str, lenght:int) : []:LogEntry
это автоматически сохраняется, но один за другим, что заставляет весь процесс выполняться в течение нескольких минут для каждого файла (+/- 14 минут), и я сталкиваюсь с примерно 200 файлами на каждый пакетная обработка

Код: Выделить всё

(...)
with self.__resolver.getDatabase().atomic():
with open(fileEntity.FileOrigin, mode="r", encoding="utf-8") as logFile:
(...)
for tuple in self.__contentCache.keys():
for entry in self.__contentCache[tuple]:
entry.Contents.add(ContentDetail.create(PropertyName=tuple[0], PropertyValue=tuple[1], ValueSizeInBytes=tuple[2]))
self.__logger.debug(f"Created content for {entry.LineNumber}")
(...)
Я пытаюсь выяснить, как я могу заставить ORM понимать отношения FileEntry и ContentDetail в соответствии с документами http://docs.peewee- orm.com/en/latest/peewee/querying.html#inserting-rows-in-batches, но я, честно говоря, не могу даже понять, как PeeWee собирается выяснить связь между записью журнала и содержимым без одного- по одному Contents.add. Есть идеи?
Может быть, мой подход неправильный. Любые предложения приветствуются

Подробнее здесь: https://stackoverflow.com/questions/781 ... peewee-orm
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»