Я разрабатываю программу на 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)
Я использую этот метод, потому что он позволяет мне обрабатывать ошибки целостности в уникальных полях.
Проблема в том, что мне приходится фиксировать сессию каждый раз, когда я вставляю новую компанию. В противном случае, если следующая операция приведет к ошибке целостности, относительный откат также не учитывает предыдущую правильную вставку. Поскольку фиксация так часто имеет недостатки производительности, есть ли другой способ справиться с такой проблемой, используя декларативный стиль?