codememo

SQLLechemy에서 bulk_update_mapping을 사용하여 서로 다른 값으로 여러 행 업데이트

tipmemo 2023. 10. 15. 17:23
반응형

SQLLechemy에서 bulk_update_mapping을 사용하여 서로 다른 값으로 여러 행 업데이트

푸와 바 두 개의 테이블이 있습니다.방금 새 칼럼을 추가했습니다.xFoo의 값을 사용하여 채워야 하는 막대 테이블로

class Foo(Base):
    __table__ = 'foo'
    id = Column(Integer, primary_key=True)
    x = Column(Integer, nullable=False)

class Bar(Base):
    __table__ = 'bar'
    id = Column(Integer, primary_key=True)
    x = Column(Integer, nullable=False)
    foo_id = Column(Integer, ForeignKey('foo.id'), nullable=False)

간단한 방법으로는 Bar의 모든 행에 걸쳐 반복한 다음 일일이 업데이트하는 것이지만 시간이 오래 걸립니다(Foo와 Bar에는 100k 이상의 행이 있음).

for b, foo_x in session.query(Bar, Foo.x).join(Foo, Foo.id==Bar.foo_id):
    b.x = foo_x
session.flush()

지금 저는 이게 옳은 방법일까 생각하고 있었습니다.

mappings = []
for b, foo_x in session.query(Bar, Foo.x).join(Foo, Foo.id==Bar.foo_id):
    info = {'id':b.id, 'x': foo_x}
    mappings.append(info)
session.bulk_update_mappings(Bar, mappings)

에 대한 예는 많지 않습니다.bulk_update_mappings저 밖에.서류에 의하면

기본 키의 일부가 아닌 존재하는 모든 키는 UPDATE 문의 SET 절에 적용되며 필수적인 기본 키 값은 WHERE 절에 적용됩니다.

그래서 이 경우에는id에 사용될 예정입니다.WHERE조항 그리고 그것은 그것을 사용하는 업데이트일 것입니다.x사전에 가치가 있죠?

그 접근법은 사용 면에서 정확합니다.제가 바꾸고 싶은 것은 아래와 같은 것뿐입니다.

mappings = []
i = 0

for b, foo_x in session.query(Bar, Foo.x).join(Foo, Foo.id==Bar.foo_id):
    info = {'id':b.id, 'x': foo_x}
    mappings.append(info)
    i = i + 1
    if i % 10000 == 0:
        session.bulk_update_mappings(Bar, mappings)
        session.flush()
        session.commit()
        mappings[:] = []

session.bulk_update_mappings(Bar, mappings)

이렇게 하면 메모리에 너무 많은 데이터가 저장되지 않으며 DB에 한번에 너무 큰 삽입을 하지 않습니다.

이 질문과 직접적인 관련은 없지만, 두 가지 방법을 모두 사용하여 업데이트/삽입할 때 더 많은 성능을 찾는 사람들을 위해:bulk_update_mappings그리고.bulk_insert_mappings, 그냥 더하면 됩니다.fast_executemany당신에게engine다음과 같이

engine = create_engine(connection_string, fast_executemany=True)

해당 매개 변수를 사용할 수 있습니다.sqlalchemy위 버전들1.3. 이 매개 변수는 다음에서 옵니다.pyodbc대량 요청 속도가 확실히 빨라질 것입니다.

언급URL : https://stackoverflow.com/questions/36272316/using-bulk-update-mappings-in-sqlalchemy-to-update-multiple-rows-with-different

반응형