высокопроизводительная вставка или обновление SQLALCHEMY python - PullRequest
1 голос
/ 22 декабря 2019

Я разрабатываю программу на Python для сбора данных из Интернета и сохранения их в БД. Я решил использовать sqlalchemy для обработки операций с базой данных, но мне сложно выполнять определенные действия при сохранении приемлемого уровня производительности. Например, когда я хочу сохранить данные в новой таблице, я использую этот рабочий процесс:

    def insertCompany(self, name, code):
        company = Company(name=name, code=code)
        self._db_session.add(company)
        try:
            self._db_session.flush()
        except IntegrityError as e:
            self._db_session.rollback()
            #update code here

        return company 
class Company(Base):
    __tablename__ = 'companies'

    id = Column(Integer, primary_key=True)
    name = Column(String(64), nullable=False, unique=True)
    code = Column(String(16), nullable=False, unique=True)
    low_cost = Column(Boolean, unique=False, default=True)

    def __repr__(self):
        return "<User(name='%s' code='%s')>" % (self.name, self.code)

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

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

1 Ответ

0 голосов
/ 22 декабря 2019

Если вы не хотите фиксировать для каждой вставки, вы можете установить уровень изоляции транзакции для модуля «READ_UNCOMMITTED». Пожалуйста, обратитесь к https://docs.sqlalchemy.org/en/13/core/engines.html#sqlalchemy.create_engine.params.isolation_level

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