SQLAlchemy - массовая вставка игнорирует Duplicate / Unique - PullRequest
0 голосов
/ 16 мая 2019

Использование Sqlalchemy. С большим набором данных я хотел бы вставить все строки, используя что-то эффективное, например session.add_all (), за которым следует session.commit (). Я ищу способ игнорировать вставку любых строк, которые вызывают дублирование / уникальные ошибки ключа. Проблема заключается в том, что эти ошибки возникают только при вызове session.commit (), поэтому невозможно выполнить эту конкретную строку и перейти к следующей.

Ближайший вопрос, который я видел, здесь: SQLAlchemy - игнорирование массовой вставки: "Дублирующая запись" ; однако в принятом ответе предлагается не использовать метод объемного размещения и фиксацию после каждой вставки строки, что является чрезвычайно медленным и приводит к огромному количеству операций ввода-вывода, поэтому я ищу лучшее решение.

1 Ответ

0 голосов
/ 01 июля 2019

Действительно.Та же проблема здесь.Похоже, они забыли о производительности, особенно когда у вас есть удаленная БД, это проблема.

Что я тогда всегда делаю, так это пишу код на Python, используя словарь или список.Трюк, например, в словаре, чтобы установить ключ и значение для тех же данных ключа.то есть

myEmailAddressesDict = {}
myEmailList = []
for emailAddress in allEmailAddresses:
    if emailAddress not in myEmailAddressesDict:
        #can add
        myEmailList.append(emailAddress)
        myEmailAddressesDict[emailAddress] = emailAddress
mySession = sessionmaker(bind=self.engine)
try:
    mySession.add_all(myEmailList)
    mySession.commit()
except Exception as e:
    print("Add exception: ", str(e))
mySession.close()

Это не решение проблемы, а своего рода обходной путь на данный момент.Ключевым моментом в этом решении является то, что вы на самом деле очистили (delete_all) БД или начали с нуля.В противном случае, если у вас уже есть БД, код все равно не будет работать.

Для этого нам понадобится что-то вроде параметра в SQLAlchemy, чтобы игнорировать дубликаты на add_all, или они должны предоставить merge_all.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...