当前位置:Gxlcms > 数据库问题 > [SQLAlchemy] synchronize_session参数详解

[SQLAlchemy] synchronize_session参数详解

时间:2021-07-01 10:21:17 帮助过:162人阅读

def _do_pre_synchronize(self): 2 query = self.query 3 session = query.session 4 context = query._compile_context() 5 select_stmt = context.statement.with_only_columns( 6 self.primary_table.primary_key) 7 self.matched_rows = session.execute( 8 select_stmt, 9 mapper=self.mapper, 10 params=query._params).fetchall()
  1. <span style="font-family: verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 1.5;">  在delete or update操作之后,将session的identity_map与前一步获取到的记录进行match,符合条件的就从session中删掉或更新。<br></span>
  1. <span style="color: #008080;"> 1</span> <span style="color: #0000ff;">def</span><span style="color: #000000;"> _do_post_synchronize(self):
  2. </span><span style="color: #008080;"> 2</span> session =<span style="color: #000000;"> self.query.session
  3. </span><span style="color: #008080;"> 3</span> target_mapper =<span style="color: #000000;"> self.query._mapper_zero()
  4. </span><span style="color: #008080;"> 4</span> <span style="color: #0000ff;">for</span> primary_key <span style="color: #0000ff;">in</span><span style="color: #000000;"> self.matched_rows:
  5. </span><span style="color: #008080;"> 5</span> <span style="color: #008000;">#</span><span style="color: #008000;"> TODO: inline this and call remove_newly_deleted</span>
  6. <span style="color: #008080;"> 6</span> <span style="color: #008000;">#</span><span style="color: #008000;"> once</span>
  7. <span style="color: #008080;"> 7</span> identity_key =<span style="color: #000000;"> target_mapper.identity_key_from_primary_key(
  8. </span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> list(primary_key))
  9. </span><span style="color: #008080;"> 9</span> <span style="color: #0000ff;">if</span> identity_key <span style="color: #0000ff;">in</span><span style="color: #000000;"> session.identity_map:
  10. </span><span style="color: #008080;">10</span> <span style="color: #000000;"> session._remove_newly_deleted(
  11. </span><span style="color: #008080;">11</span> <span style="color: #000000;"> [attributes.instance_state(
  12. </span><span style="color: #008080;">12</span> <span style="color: #000000;"> session.identity_map[identity_key]
  13. </span><span style="color: #008080;">13</span> <span style="color: #000000;"> )]
  14. </span><span style="color: #008080;">14</span> )
  • ‘evaluate‘

   在delete or update操作之前,用query中的条件直接对session的identity_map中的objects进行eval操作,将符合条件的记录下来。

  1. <span style="color: #008080;"> 1</span> <span style="color: #0000ff;">def</span><span style="color: #000000;"> _do_pre_synchronize(self):
  2. </span><span style="color: #008080;"> 2</span> query =<span style="color: #000000;"> self.query
  3. </span><span style="color: #008080;"> 3</span> target_cls =<span style="color: #000000;"> query._mapper_zero().class_
  4. </span><span style="color: #008080;"> 4</span>
  5. <span style="color: #008080;"> 5</span> <span style="color: #0000ff;">try</span><span style="color: #000000;">:
  6. </span><span style="color: #008080;"> 6</span> evaluator_compiler =<span style="color: #000000;"> evaluator.EvaluatorCompiler(target_cls)
  7. </span><span style="color: #008080;"> 7</span> <span style="color: #0000ff;">if</span> query.whereclause <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">not</span><span style="color: #000000;"> None:
  8. </span><span style="color: #008080;"> 8</span> eval_condition =<span style="color: #000000;"> evaluator_compiler.process(
  9. </span><span style="color: #008080;"> 9</span> <span style="color: #000000;"> query.whereclause)
  10. </span><span style="color: #008080;">10</span> <span style="color: #0000ff;">else</span><span style="color: #000000;">:
  11. </span><span style="color: #008080;">11</span> <span style="color: #0000ff;">def</span><span style="color: #000000;"> eval_condition(obj):
  12. </span><span style="color: #008080;">12</span> <span style="color: #0000ff;">return</span><span style="color: #000000;"> True
  13. </span><span style="color: #008080;">13</span>
  14. <span style="color: #008080;">14</span> <span style="color: #000000;"> self._additional_evaluators(evaluator_compiler)
  15. </span><span style="color: #008080;">15</span>
  16. <span style="color: #008080;">16</span> <span style="color: #0000ff;">except</span><span style="color: #000000;"> evaluator.UnevaluatableError:
  17. </span><span style="color: #008080;">17</span> <span style="color: #0000ff;">raise</span><span style="color: #000000;"> sa_exc.InvalidRequestError(
  18. </span><span style="color: #008080;">18</span> <span style="color: #800000;">"</span><span style="color: #800000;">Could not evaluate current criteria in Python. </span><span style="color: #800000;">"</span>
  19. <span style="color: #008080;">19</span> <span style="color: #800000;">"</span><span style="color: #800000;">Specify ‘fetch‘ or False for the </span><span style="color: #800000;">"</span>
  20. <span style="color: #008080;">20</span> <span style="color: #800000;">"</span><span style="color: #800000;">synchronize_session parameter.</span><span style="color: #800000;">"</span><span style="color: #000000;">)
  21. </span><span style="color: #008080;">21</span>
  22. <span style="color: #008080;">22</span> <span style="color: #008000;">#</span><span style="color: #008000;"> TODO: detect when the where clause is a trivial primary key match</span>
  23. <span style="color: #008080;">23</span> self.matched_objects =<span style="color: #000000;"> [
  24. </span><span style="color: #008080;">24</span> obj <span style="color: #0000ff;">for</span> (cls, pk), obj <span style="color: #0000ff;">in</span>
  25. <span style="color: #008080;">25</span> <span style="color: #000000;"> query.session.identity_map.items()
  26. </span><span style="color: #008080;">26</span> <span style="color: #0000ff;">if</span> issubclass(cls, target_cls) <span style="color: #0000ff;">and</span>
  27. <span style="color: #008080;">27</span> eval_condition(obj)]

   在delete or update操作之后,将符合条件的记录删除或更新。

  1. <span style="color: #008080;">1</span> <span style="color: #0000ff;">def</span><span style="color: #000000;"> _do_post_synchronize(self):
  2. </span><span style="color: #008080;">2</span> <span style="color: #000000;"> self.query.session._remove_newly_deleted(
  3. </span><span style="color: #008080;">3</span> <span style="color: #000000;"> [attributes.instance_state(obj)
  4. </span><span style="color: #008080;">4</span> <span style="color: #0000ff;">for</span> obj <span style="color: #0000ff;">in</span> self.matched_objects])

[SQLAlchemy] synchronize_session参数详解

标签:

人气教程排行