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
'codememo' 카테고리의 다른 글
| 테이블 셀(td)에서 해당 테이블 헤더(th)를 가져오려면 어떻게 해야 합니까? (0) | 2023.10.15 |
|---|---|
| MySQL IN 절: 최대 인수 수 (0) | 2023.10.15 |
| XMLHtpRequest가 헤더를 추가하지 않음 - "X-Requested-With: XMLHtpRequest" (0) | 2023.10.15 |
| 크롬이 렌더링되지 않음크롬이 렌더링되지 않음태그, FF가 합니다. (0) | 2023.10.15 |
| 사용자가 온라인 상태인지 확인하는 가장 쉬운 방법은 무엇입니까? (PHP/MYSQL) (0) | 2023.10.15 |