SQLAlchemy学习笔记

本文记录SQLAlchemy学习及使用笔记。

  • 如何替换一个已有主键的记录?

    使用session.merge()方法替换session.add(),其实就是SELECT + UPDATE

  • 插入大量数据

    • ORM方式

      1
      2
      3
      4
      5
      6
      7
      s = Session()
      objects = [
      User(name="u1"),
      User(name="u2"),
      User(name="u3")
      ]
      s.bulk_save_objects(objects)

      如果插入字典形式的数据,可以使用 Session.bulk_insert_mappings(), 和 Session.bulk_update_mappings()

      1
      2
      3
      s.bulk_insert_mappings(User,
      [dict(name="u1"), dict(name="u2"), dict(name="u3")]
      )
    • 非ORM方式

      1
      2
      3
      4
      5
      session.execute(
      User.__table__.insert(),
      [{'name': `randint(1, 100)`,'age': randint(1, 100)} for i in xrange(10000)]
      )
      session.commit()
  • 获取大量数据

    • 使用stream方式

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      def test_core_fetchmany_w_streaming(n):
      """Load Core result rows using fetchmany/streaming."""

      with engine.connect() as conn:
      result = conn.execution_options(stream_results=True).\
      execute(Customer.__table__.select().limit(n))
      while True:
      chunk = result.fetchmany(10000)
      if not chunk:
      break
      for row in chunk:
      data = row['id'], row['name'], row['description']
    • 使用yield_per方式

      1
      2
      3
      4
      5
      6
      def test_orm_full_objects_chunks(n):
      """Load fully tracked ORM objects a chunk at a time using yield_per()."""

      sess = Session(engine)
      for obj in sess.query(Customer).yield_per(1000).enable_eagerloads(False).limit(n):
      pass
发布时间: 2018年08月02日 - 16时28分
更新时间: 2018年10月17日 - 21时42分
原始链接: https://oaoa.me/posts/3f023ecf/