| 71 | engine.dispose() |
| 72 | |
| 73 | def prepare_models(self, engine): |
| 74 | if not self.prepared: |
| 75 | # SQLAlchemy will check if the items exist before trying to |
| 76 | # create them, which is a race condition. If it raises an error |
| 77 | # in one iteration, the next may pass all the existence checks |
| 78 | # and the call will succeed. |
| 79 | retries = 0 |
| 80 | while True: |
| 81 | try: |
| 82 | ResultModelBase.metadata.create_all(engine) |
| 83 | except DatabaseError: |
| 84 | if retries < PREPARE_MODELS_MAX_RETRIES: |
| 85 | sleep_amount_ms = get_exponential_backoff_interval( |
| 86 | 10, retries, 1000, True |
| 87 | ) |
| 88 | time.sleep(sleep_amount_ms / 1000) |
| 89 | retries += 1 |
| 90 | else: |
| 91 | raise |
| 92 | else: |
| 93 | break |
| 94 | self.prepared = True |
| 95 | |
| 96 | def session_factory(self, dburi, **kwargs): |
| 97 | engine, session = self.create_session(dburi, **kwargs) |