dbos 1.3.0a2__tar.gz → 1.3.0a4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. {dbos-1.3.0a2 → dbos-1.3.0a4}/PKG-INFO +1 -1
  2. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_client.py +8 -1
  3. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_core.py +22 -13
  4. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_dbos.py +2 -0
  5. dbos-1.3.0a4/dbos/_migrations/versions/66478e1b95e5_consolidate_queues.py +71 -0
  6. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_queue.py +11 -0
  7. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_schemas/system_database.py +9 -52
  8. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_sys_db.py +147 -276
  9. {dbos-1.3.0a2 → dbos-1.3.0a4}/pyproject.toml +1 -1
  10. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/client_collateral.py +1 -1
  11. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/conftest.py +12 -1
  12. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_dbos.py +1 -23
  13. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_fastapi.py +1 -23
  14. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_flask.py +1 -23
  15. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_queue.py +2 -2
  16. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_scheduler.py +1 -23
  17. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_schema_migration.py +0 -4
  18. {dbos-1.3.0a2 → dbos-1.3.0a4}/LICENSE +0 -0
  19. {dbos-1.3.0a2 → dbos-1.3.0a4}/README.md +0 -0
  20. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/__init__.py +0 -0
  21. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/__main__.py +0 -0
  22. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_admin_server.py +0 -0
  23. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_app_db.py +0 -0
  24. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_classproperty.py +0 -0
  25. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_conductor/conductor.py +0 -0
  26. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_conductor/protocol.py +0 -0
  27. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_context.py +0 -0
  28. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_croniter.py +0 -0
  29. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_dbos_config.py +0 -0
  30. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_debug.py +0 -0
  31. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_docker_pg_helper.py +0 -0
  32. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_error.py +0 -0
  33. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_event_loop.py +0 -0
  34. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_fastapi.py +0 -0
  35. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_flask.py +0 -0
  36. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_kafka.py +0 -0
  37. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_kafka_message.py +0 -0
  38. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_logger.py +0 -0
  39. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_migrations/env.py +0 -0
  40. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_migrations/script.py.mako +0 -0
  41. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_migrations/versions/04ca4f231047_workflow_queues_executor_id.py +0 -0
  42. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_migrations/versions/27ac6900c6ad_add_queue_dedup.py +0 -0
  43. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_migrations/versions/50f3227f0b4b_fix_job_queue.py +0 -0
  44. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_migrations/versions/5c361fc04708_added_system_tables.py +0 -0
  45. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_migrations/versions/83f3732ae8e7_workflow_timeout.py +0 -0
  46. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_migrations/versions/933e86bdac6a_add_queue_priority.py +0 -0
  47. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_migrations/versions/a3b18ad34abe_added_triggers.py +0 -0
  48. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_migrations/versions/d76646551a6b_job_queue_limiter.py +0 -0
  49. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_migrations/versions/d76646551a6c_workflow_queue.py +0 -0
  50. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_migrations/versions/eab0cc1d9a14_job_queue.py +0 -0
  51. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_migrations/versions/f4b9b32ba814_functionname_childid_op_outputs.py +0 -0
  52. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_outcome.py +0 -0
  53. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_recovery.py +0 -0
  54. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_registrations.py +0 -0
  55. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_roles.py +0 -0
  56. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_scheduler.py +0 -0
  57. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_schemas/__init__.py +0 -0
  58. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_schemas/application_database.py +0 -0
  59. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_serialization.py +0 -0
  60. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_templates/dbos-db-starter/README.md +0 -0
  61. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_templates/dbos-db-starter/__package/__init__.py +0 -0
  62. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_templates/dbos-db-starter/__package/main.py.dbos +0 -0
  63. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_templates/dbos-db-starter/__package/schema.py +0 -0
  64. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_templates/dbos-db-starter/alembic.ini +0 -0
  65. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_templates/dbos-db-starter/dbos-config.yaml.dbos +0 -0
  66. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_templates/dbos-db-starter/migrations/env.py.dbos +0 -0
  67. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_templates/dbos-db-starter/migrations/script.py.mako +0 -0
  68. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_templates/dbos-db-starter/migrations/versions/2024_07_31_180642_init.py +0 -0
  69. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_templates/dbos-db-starter/start_postgres_docker.py +0 -0
  70. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_tracer.py +0 -0
  71. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_utils.py +0 -0
  72. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/_workflow_commands.py +0 -0
  73. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/cli/_github_init.py +0 -0
  74. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/cli/_template_init.py +0 -0
  75. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/cli/cli.py +0 -0
  76. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/dbos-config.schema.json +0 -0
  77. {dbos-1.3.0a2 → dbos-1.3.0a4}/dbos/py.typed +0 -0
  78. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/__init__.py +0 -0
  79. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/atexit_no_ctor.py +0 -0
  80. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/atexit_no_launch.py +0 -0
  81. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/classdefs.py +0 -0
  82. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/client_worker.py +0 -0
  83. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/dupname_classdefs1.py +0 -0
  84. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/dupname_classdefsa.py +0 -0
  85. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/more_classdefs.py +0 -0
  86. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/queuedworkflow.py +0 -0
  87. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_admin_server.py +0 -0
  88. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_async.py +0 -0
  89. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_classdecorators.py +0 -0
  90. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_cli.py +0 -0
  91. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_client.py +0 -0
  92. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_concurrency.py +0 -0
  93. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_config.py +0 -0
  94. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_croniter.py +0 -0
  95. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_debug.py +0 -0
  96. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_docker_secrets.py +0 -0
  97. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_failures.py +0 -0
  98. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_fastapi_roles.py +0 -0
  99. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_kafka.py +0 -0
  100. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_outcome.py +0 -0
  101. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_package.py +0 -0
  102. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_singleton.py +0 -0
  103. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_spans.py +0 -0
  104. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_sqlalchemy.py +0 -0
  105. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_workflow_introspection.py +0 -0
  106. {dbos-1.3.0a2 → dbos-1.3.0a4}/tests/test_workflow_management.py +0 -0
  107. {dbos-1.3.0a2 → dbos-1.3.0a4}/version/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dbos
3
- Version: 1.3.0a2
3
+ Version: 1.3.0a4
4
4
  Summary: Ultra-lightweight durable execution in Python
5
5
  Author-Email: "DBOS, Inc." <contact@dbos.dev>
6
6
  License: MIT
@@ -163,6 +163,12 @@ class DBOSClient:
163
163
  int(workflow_timeout * 1000) if workflow_timeout is not None else None
164
164
  ),
165
165
  "workflow_deadline_epoch_ms": None,
166
+ "deduplication_id": enqueue_options_internal["deduplication_id"],
167
+ "priority": (
168
+ enqueue_options_internal["priority"]
169
+ if enqueue_options_internal["priority"] is not None
170
+ else 0
171
+ ),
166
172
  }
167
173
 
168
174
  inputs: WorkflowInputs = {
@@ -174,7 +180,6 @@ class DBOSClient:
174
180
  status,
175
181
  _serialization.serialize_args(inputs),
176
182
  max_recovery_attempts=None,
177
- enqueue_options=enqueue_options_internal,
178
183
  )
179
184
  return workflow_id
180
185
 
@@ -230,6 +235,8 @@ class DBOSClient:
230
235
  "app_version": None,
231
236
  "workflow_timeout_ms": None,
232
237
  "workflow_deadline_epoch_ms": None,
238
+ "deduplication_id": None,
239
+ "priority": 0,
233
240
  }
234
241
  with self._sys_db.engine.begin() as conn:
235
242
  self._sys_db._insert_workflow_status(
@@ -279,6 +279,18 @@ def _init_workflow(
279
279
  "updated_at": None,
280
280
  "workflow_timeout_ms": workflow_timeout_ms,
281
281
  "workflow_deadline_epoch_ms": workflow_deadline_epoch_ms,
282
+ "deduplication_id": (
283
+ enqueue_options["deduplication_id"] if enqueue_options is not None else None
284
+ ),
285
+ "priority": (
286
+ (
287
+ enqueue_options["priority"]
288
+ if enqueue_options["priority"] is not None
289
+ else 0
290
+ )
291
+ if enqueue_options is not None
292
+ else 0
293
+ ),
282
294
  }
283
295
 
284
296
  # If we have a class name, the first arg is the instance and do not serialize
@@ -290,7 +302,6 @@ def _init_workflow(
290
302
  status,
291
303
  _serialization.serialize_args(inputs),
292
304
  max_recovery_attempts=max_recovery_attempts,
293
- enqueue_options=enqueue_options,
294
305
  )
295
306
 
296
307
  if workflow_deadline_epoch_ms is not None:
@@ -342,13 +353,12 @@ def _get_wf_invoke_func(
342
353
  return recorded_result
343
354
  try:
344
355
  output = func()
345
- status["status"] = "SUCCESS"
346
- status["output"] = _serialization.serialize(output)
347
356
  if not dbos.debug_mode:
348
- if status["queue_name"] is not None:
349
- queue = dbos._registry.queue_info_map[status["queue_name"]]
350
- dbos._sys_db.remove_from_queue(status["workflow_uuid"], queue)
351
- dbos._sys_db.update_workflow_status(status)
357
+ dbos._sys_db.update_workflow_outcome(
358
+ status["workflow_uuid"],
359
+ "SUCCESS",
360
+ output=_serialization.serialize(output),
361
+ )
352
362
  return output
353
363
  except DBOSWorkflowConflictIDError:
354
364
  # Await the workflow result
@@ -357,13 +367,12 @@ def _get_wf_invoke_func(
357
367
  except DBOSWorkflowCancelledError as error:
358
368
  raise
359
369
  except Exception as error:
360
- status["status"] = "ERROR"
361
- status["error"] = _serialization.serialize_exception(error)
362
370
  if not dbos.debug_mode:
363
- if status["queue_name"] is not None:
364
- queue = dbos._registry.queue_info_map[status["queue_name"]]
365
- dbos._sys_db.remove_from_queue(status["workflow_uuid"], queue)
366
- dbos._sys_db.update_workflow_status(status)
371
+ dbos._sys_db.update_workflow_outcome(
372
+ status["workflow_uuid"],
373
+ "ERROR",
374
+ error=_serialization.serialize_exception(error),
375
+ )
367
376
  raise
368
377
 
369
378
  return persist
@@ -215,6 +215,8 @@ class DBOSRegistry:
215
215
  sources = sorted(
216
216
  [inspect.getsource(wf) for wf in self.workflow_info_map.values()]
217
217
  )
218
+ # Different DBOS versions should produce different app versions
219
+ sources.append(GlobalParams.dbos_version)
218
220
  for source in sources:
219
221
  hasher.update(source.encode("utf-8"))
220
222
  return hasher.hexdigest()
@@ -0,0 +1,71 @@
1
+ """consolidate_queues
2
+
3
+ Revision ID: 66478e1b95e5
4
+ Revises: 933e86bdac6a
5
+ Create Date: 2025-05-21 10:14:25.674613
6
+
7
+ """
8
+
9
+ from typing import Sequence, Union
10
+
11
+ import sqlalchemy as sa
12
+ from alembic import op
13
+
14
+ # revision identifiers, used by Alembic.
15
+ revision: str = "66478e1b95e5"
16
+ down_revision: Union[str, None] = "933e86bdac6a"
17
+ branch_labels: Union[str, Sequence[str], None] = None
18
+ depends_on: Union[str, Sequence[str], None] = None
19
+
20
+
21
+ def upgrade() -> None:
22
+ # Add new columns to workflow_status table
23
+ op.add_column(
24
+ "workflow_status",
25
+ sa.Column("started_at_epoch_ms", sa.BigInteger(), nullable=True),
26
+ schema="dbos",
27
+ )
28
+
29
+ op.add_column(
30
+ "workflow_status",
31
+ sa.Column("deduplication_id", sa.Text(), nullable=True),
32
+ schema="dbos",
33
+ )
34
+
35
+ op.add_column(
36
+ "workflow_status",
37
+ sa.Column(
38
+ "priority", sa.Integer(), nullable=False, server_default=sa.text("'0'::int")
39
+ ),
40
+ schema="dbos",
41
+ )
42
+
43
+ # Add unique constraint for deduplication_id
44
+ op.create_unique_constraint(
45
+ "uq_workflow_status_queue_name_dedup_id",
46
+ "workflow_status",
47
+ ["queue_name", "deduplication_id"],
48
+ schema="dbos",
49
+ )
50
+
51
+ # Add index on status field
52
+ op.create_index(
53
+ "workflow_status_status_index", "workflow_status", ["status"], schema="dbos"
54
+ )
55
+
56
+
57
+ def downgrade() -> None:
58
+ # Drop indexes
59
+ op.drop_index(
60
+ "workflow_status_status_index", table_name="workflow_status", schema="dbos"
61
+ )
62
+
63
+ # Drop unique constraint
64
+ op.drop_constraint(
65
+ "uq_workflow_status_queue_name_dedup_id", "workflow_status", schema="dbos"
66
+ )
67
+
68
+ # Drop columns
69
+ op.drop_column("workflow_status", "priority", schema="dbos")
70
+ op.drop_column("workflow_status", "deduplication_id", schema="dbos")
71
+ op.drop_column("workflow_status", "started_at_epoch_ms", schema="dbos")
@@ -5,6 +5,7 @@ from typing import TYPE_CHECKING, Any, Callable, Coroutine, Optional, TypedDict
5
5
  from psycopg import errors
6
6
  from sqlalchemy.exc import OperationalError
7
7
 
8
+ from dbos._context import get_local_dbos_context
8
9
  from dbos._logger import dbos_logger
9
10
  from dbos._utils import GlobalParams
10
11
 
@@ -41,6 +42,7 @@ class Queue:
41
42
  limiter: Optional[QueueRateLimit] = None,
42
43
  *, # Disable positional arguments from here on
43
44
  worker_concurrency: Optional[int] = None,
45
+ priority_enabled: bool = False,
44
46
  ) -> None:
45
47
  if (
46
48
  worker_concurrency is not None
@@ -54,6 +56,7 @@ class Queue:
54
56
  self.concurrency = concurrency
55
57
  self.worker_concurrency = worker_concurrency
56
58
  self.limiter = limiter
59
+ self.priority_enabled = priority_enabled
57
60
  from ._dbos import _get_or_create_dbos_registry
58
61
 
59
62
  registry = _get_or_create_dbos_registry()
@@ -66,6 +69,14 @@ class Queue:
66
69
  ) -> "WorkflowHandle[R]":
67
70
  from ._dbos import _get_dbos_instance
68
71
 
72
+ context = get_local_dbos_context()
73
+ if (
74
+ context is not None
75
+ and context.priority is not None
76
+ and not self.priority_enabled
77
+ ):
78
+ dbos_logger.warning(f"Priority is not enabled for queue {self.name}. Setting priority will not have any effect.")
79
+
69
80
  dbos = _get_dbos_instance()
70
81
  return start_workflow(dbos, func, self.name, False, *args, **kwargs)
71
82
 
@@ -1,6 +1,5 @@
1
1
  from sqlalchemy import (
2
2
  BigInteger,
3
- Boolean,
4
3
  Column,
5
4
  ForeignKey,
6
5
  Index,
@@ -57,8 +56,17 @@ class SystemSchema:
57
56
  Column("queue_name", Text, nullable=True),
58
57
  Column("workflow_timeout_ms", BigInteger, nullable=True),
59
58
  Column("workflow_deadline_epoch_ms", BigInteger, nullable=True),
59
+ Column("started_at_epoch_ms", BigInteger(), nullable=True),
60
+ Column("deduplication_id", Text(), nullable=True),
61
+ Column("priority", Integer(), nullable=False, server_default=text("'0'::int")),
60
62
  Index("workflow_status_created_at_index", "created_at"),
61
63
  Index("workflow_status_executor_id_index", "executor_id"),
64
+ Index("workflow_status_status_index", "status"),
65
+ UniqueConstraint(
66
+ "queue_name",
67
+ "deduplication_id",
68
+ name="uq_workflow_status_queue_name_dedup_id",
69
+ ),
62
70
  )
63
71
 
64
72
  operation_outputs = Table(
@@ -138,54 +146,3 @@ class SystemSchema:
138
146
  Column("value", Text, nullable=False),
139
147
  PrimaryKeyConstraint("workflow_uuid", "key"),
140
148
  )
141
-
142
- scheduler_state = Table(
143
- "scheduler_state",
144
- metadata_obj,
145
- Column("workflow_fn_name", Text, primary_key=True, nullable=False),
146
- Column("last_run_time", BigInteger, nullable=False),
147
- )
148
-
149
- workflow_queue = Table(
150
- "workflow_queue",
151
- metadata_obj,
152
- Column(
153
- "workflow_uuid",
154
- Text,
155
- ForeignKey(
156
- "workflow_status.workflow_uuid", onupdate="CASCADE", ondelete="CASCADE"
157
- ),
158
- nullable=False,
159
- primary_key=True,
160
- ),
161
- # Column("executor_id", Text), # This column is deprecated. Do *not* use it.
162
- Column("queue_name", Text, nullable=False),
163
- Column(
164
- "created_at_epoch_ms",
165
- BigInteger,
166
- nullable=False,
167
- server_default=text("(EXTRACT(epoch FROM now()) * 1000::numeric)::bigint"),
168
- ),
169
- Column(
170
- "started_at_epoch_ms",
171
- BigInteger(),
172
- ),
173
- Column(
174
- "completed_at_epoch_ms",
175
- BigInteger(),
176
- ),
177
- Column(
178
- "deduplication_id",
179
- Text,
180
- nullable=True,
181
- ),
182
- Column(
183
- "priority",
184
- Integer,
185
- nullable=False,
186
- server_default=text("'0'::int"),
187
- ),
188
- UniqueConstraint(
189
- "queue_name", "deduplication_id", name="uq_workflow_queue_name_dedup_id"
190
- ),
191
- )