dbos 1.14.0a8__py3-none-any.whl → 1.15.0a1__py3-none-any.whl

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.

Potentially problematic release.


This version of dbos might be problematic. Click here for more details.

Files changed (45) hide show
  1. dbos/_client.py +13 -14
  2. dbos/_context.py +12 -6
  3. dbos/_core.py +2 -7
  4. dbos/_dbos.py +5 -13
  5. dbos/_dbos_config.py +17 -29
  6. dbos/_debouncer.py +13 -24
  7. dbos/_debug.py +0 -8
  8. dbos/_docker_pg_helper.py +93 -51
  9. dbos/_fastapi.py +5 -1
  10. dbos/_logger.py +18 -21
  11. dbos/_migration.py +4 -41
  12. dbos/_serialization.py +19 -30
  13. dbos/_sys_db_postgres.py +2 -9
  14. dbos/_templates/dbos-db-starter/migrations/create_table.py.dbos +34 -0
  15. dbos/_tracer.py +42 -31
  16. dbos/cli/_github_init.py +22 -16
  17. dbos/cli/_template_init.py +5 -16
  18. dbos/cli/cli.py +20 -28
  19. {dbos-1.14.0a8.dist-info → dbos-1.15.0a1.dist-info}/METADATA +8 -16
  20. dbos-1.15.0a1.dist-info/RECORD +59 -0
  21. dbos/_alembic_migrations/env.py +0 -62
  22. dbos/_alembic_migrations/script.py.mako +0 -26
  23. dbos/_alembic_migrations/versions/01ce9f07bd10_streaming.py +0 -42
  24. dbos/_alembic_migrations/versions/04ca4f231047_workflow_queues_executor_id.py +0 -34
  25. dbos/_alembic_migrations/versions/27ac6900c6ad_add_queue_dedup.py +0 -45
  26. dbos/_alembic_migrations/versions/471b60d64126_dbos_migrations.py +0 -35
  27. dbos/_alembic_migrations/versions/50f3227f0b4b_fix_job_queue.py +0 -35
  28. dbos/_alembic_migrations/versions/5c361fc04708_added_system_tables.py +0 -193
  29. dbos/_alembic_migrations/versions/66478e1b95e5_consolidate_queues.py +0 -71
  30. dbos/_alembic_migrations/versions/83f3732ae8e7_workflow_timeout.py +0 -44
  31. dbos/_alembic_migrations/versions/933e86bdac6a_add_queue_priority.py +0 -35
  32. dbos/_alembic_migrations/versions/a3b18ad34abe_added_triggers.py +0 -72
  33. dbos/_alembic_migrations/versions/d76646551a6b_job_queue_limiter.py +0 -43
  34. dbos/_alembic_migrations/versions/d76646551a6c_workflow_queue.py +0 -28
  35. dbos/_alembic_migrations/versions/d994145b47b6_consolidate_inputs.py +0 -30
  36. dbos/_alembic_migrations/versions/eab0cc1d9a14_job_queue.py +0 -56
  37. dbos/_alembic_migrations/versions/f4b9b32ba814_functionname_childid_op_outputs.py +0 -46
  38. dbos/_templates/dbos-db-starter/alembic.ini +0 -116
  39. dbos/_templates/dbos-db-starter/migrations/env.py.dbos +0 -85
  40. dbos/_templates/dbos-db-starter/migrations/script.py.mako +0 -26
  41. dbos/_templates/dbos-db-starter/migrations/versions/2024_07_31_180642_init.py +0 -35
  42. dbos-1.14.0a8.dist-info/RECORD +0 -79
  43. {dbos-1.14.0a8.dist-info → dbos-1.15.0a1.dist-info}/WHEEL +0 -0
  44. {dbos-1.14.0a8.dist-info → dbos-1.15.0a1.dist-info}/entry_points.txt +0 -0
  45. {dbos-1.14.0a8.dist-info → dbos-1.15.0a1.dist-info}/licenses/LICENSE +0 -0
@@ -1,44 +0,0 @@
1
- """workflow_timeout
2
-
3
- Revision ID: 83f3732ae8e7
4
- Revises: f4b9b32ba814
5
- Create Date: 2025-04-16 17:05:36.642395
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 = "83f3732ae8e7"
16
- down_revision: Union[str, None] = "f4b9b32ba814"
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
- op.add_column(
23
- "workflow_status",
24
- sa.Column(
25
- "workflow_timeout_ms",
26
- sa.BigInteger(),
27
- nullable=True,
28
- ),
29
- schema="dbos",
30
- )
31
- op.add_column(
32
- "workflow_status",
33
- sa.Column(
34
- "workflow_deadline_epoch_ms",
35
- sa.BigInteger(),
36
- nullable=True,
37
- ),
38
- schema="dbos",
39
- )
40
-
41
-
42
- def downgrade() -> None:
43
- op.drop_column("workflow_status", "workflow_deadline_epoch_ms", schema="dbos")
44
- op.drop_column("workflow_status", "workflow_timeout_ms", schema="dbos")
@@ -1,35 +0,0 @@
1
- """add queue priority
2
-
3
- Revision ID: 933e86bdac6a
4
- Revises: 27ac6900c6ad
5
- Create Date: 2025-04-25 18:17:40.462737
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 = "933e86bdac6a"
16
- down_revision: Union[str, None] = "27ac6900c6ad"
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
- op.add_column(
23
- "workflow_queue",
24
- sa.Column(
25
- "priority",
26
- sa.Integer(),
27
- nullable=False,
28
- server_default=sa.text("'0'::int"),
29
- ),
30
- schema="dbos",
31
- )
32
-
33
-
34
- def downgrade() -> None:
35
- op.drop_column("workflow_queue", "priority", schema="dbos")
@@ -1,72 +0,0 @@
1
- """
2
- Add triggers.
3
-
4
- Revision ID: a3b18ad34abe
5
- Revises: 5c361fc04708
6
- Create Date: 2024-07-21 13:07:09.814989
7
- """
8
-
9
- from typing import Sequence, Union
10
-
11
- from alembic import op
12
-
13
- # revision identifiers, used by Alembic.
14
- revision: str = "a3b18ad34abe"
15
- down_revision: Union[str, None] = "5c361fc04708"
16
- branch_labels: Union[str, Sequence[str], None] = None
17
- depends_on: Union[str, Sequence[str], None] = None
18
-
19
-
20
- def upgrade() -> None:
21
-
22
- op.execute(
23
- """
24
- CREATE OR REPLACE FUNCTION dbos.notifications_function() RETURNS TRIGGER AS $$
25
- DECLARE
26
- payload text := NEW.destination_uuid || '::' || NEW.topic;
27
- BEGIN
28
- PERFORM pg_notify('dbos_notifications_channel', payload);
29
- RETURN NEW;
30
- END;
31
- $$ LANGUAGE plpgsql;
32
- """
33
- )
34
- op.execute(
35
- """
36
- CREATE TRIGGER dbos_notifications_trigger
37
- AFTER INSERT ON dbos.notifications
38
- FOR EACH ROW EXECUTE FUNCTION dbos.notifications_function();
39
- """
40
- )
41
- op.execute(
42
- """
43
- CREATE OR REPLACE FUNCTION dbos.workflow_events_function() RETURNS TRIGGER AS $$
44
- DECLARE
45
- payload text := NEW.workflow_uuid || '::' || NEW.key;
46
- BEGIN
47
- PERFORM pg_notify('dbos_workflow_events_channel', payload);
48
- RETURN NEW;
49
- END;
50
- $$ LANGUAGE plpgsql;
51
- """
52
- )
53
- op.execute(
54
- """
55
- CREATE TRIGGER dbos_workflow_events_trigger
56
- AFTER INSERT ON dbos.workflow_events
57
- FOR EACH ROW EXECUTE FUNCTION dbos.workflow_events_function();
58
- """
59
- )
60
- # ### end Alembic commands ###
61
-
62
-
63
- def downgrade() -> None:
64
- op.execute(
65
- "DROP TRIGGER IF EXISTS dbos_notifications_trigger ON dbos.notifications;"
66
- )
67
- op.execute("DROP FUNCTION IF EXISTS dbos.notifications_function;")
68
- op.execute(
69
- "DROP TRIGGER IF EXISTS dbos_workflow_events_trigger ON dbos.workflow_events;"
70
- )
71
- op.execute("DROP FUNCTION IF EXISTS dbos.workflow_events_function;")
72
- # ### end Alembic commands ###
@@ -1,43 +0,0 @@
1
- """
2
- Adjust workflow queue to add columns for rate limiter.
3
-
4
- Revision ID: d76646551a6b
5
- Revises: 50f3227f0b4b
6
- Create Date: 2024-09-25 14:48:10.218015
7
-
8
- """
9
-
10
- from typing import Sequence, Union
11
-
12
- import sqlalchemy as sa
13
- from alembic import op
14
-
15
- # revision identifiers, used by Alembic.
16
- revision: str = "d76646551a6b"
17
- down_revision: Union[str, None] = "50f3227f0b4b"
18
- branch_labels: Union[str, Sequence[str], None] = None
19
- depends_on: Union[str, Sequence[str], None] = None
20
-
21
-
22
- def upgrade() -> None:
23
- op.add_column(
24
- "job_queue",
25
- sa.Column(
26
- "started_at_epoch_ms",
27
- sa.BigInteger(),
28
- ),
29
- schema="dbos",
30
- )
31
- op.add_column(
32
- "job_queue",
33
- sa.Column(
34
- "completed_at_epoch_ms",
35
- sa.BigInteger(),
36
- ),
37
- schema="dbos",
38
- )
39
-
40
-
41
- def downgrade() -> None:
42
- op.drop_column("job_queue", "started_at_epoch_ms", schema="dbos")
43
- op.drop_column("job_queue", "completed_at_epoch_ms", schema="dbos")
@@ -1,28 +0,0 @@
1
- """workflow_queue
2
-
3
- Revision ID: d76646551a6c
4
- Revises: d76646551a6b
5
- Create Date: 2024-09-27 12:00:00.0
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 = "d76646551a6c"
16
- down_revision: Union[str, None] = "d76646551a6b"
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
- op.rename_table("job_queue", "workflow_queue", schema="dbos")
23
- op.execute("CREATE VIEW dbos.job_queue AS SELECT * FROM dbos.workflow_queue;")
24
-
25
-
26
- def downgrade() -> None:
27
- op.execute("DROP VIEW dbos.job_queue;")
28
- op.rename_table("workflow_queue", "job_queue", schema="dbos")
@@ -1,30 +0,0 @@
1
- """consolidate_inputs
2
-
3
- Revision ID: d994145b47b6
4
- Revises: 66478e1b95e5
5
- Create Date: 2025-05-23 08:09:15.515009
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 = "d994145b47b6"
16
- down_revision: Union[str, None] = "66478e1b95e5"
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
- op.add_column(
23
- "workflow_status",
24
- sa.Column("inputs", sa.Text(), nullable=True),
25
- schema="dbos",
26
- )
27
-
28
-
29
- def downgrade() -> None:
30
- op.drop_column("workflow_status", "inputs", schema="dbos")
@@ -1,56 +0,0 @@
1
- """
2
- Add workflow queue table.
3
-
4
- Revision ID: eab0cc1d9a14
5
- Revises: a3b18ad34abe
6
- Create Date: 2024-09-13 14:50:00.531294
7
-
8
- """
9
-
10
- from typing import Sequence, Union
11
-
12
- import sqlalchemy as sa
13
- from alembic import op
14
-
15
- # revision identifiers, used by Alembic.
16
- revision: str = "eab0cc1d9a14"
17
- down_revision: Union[str, None] = "a3b18ad34abe"
18
- branch_labels: Union[str, Sequence[str], None] = None
19
- depends_on: Union[str, Sequence[str], None] = None
20
-
21
-
22
- def upgrade() -> None:
23
- op.create_table(
24
- "job_queue",
25
- sa.Column("workflow_uuid", sa.Text(), nullable=False),
26
- sa.Column("queue_name", sa.Text(), nullable=False),
27
- sa.Column(
28
- "created_at_epoch_ms",
29
- sa.BigInteger(),
30
- server_default=sa.text(
31
- "(EXTRACT(epoch FROM now()) * 1000::numeric)::bigint"
32
- ),
33
- nullable=False,
34
- primary_key=True,
35
- ),
36
- sa.ForeignKeyConstraint(
37
- ["workflow_uuid"],
38
- ["dbos.workflow_status.workflow_uuid"],
39
- onupdate="CASCADE",
40
- ondelete="CASCADE",
41
- ),
42
- schema="dbos",
43
- )
44
- op.add_column(
45
- "workflow_status",
46
- sa.Column(
47
- "queue_name",
48
- sa.Text(),
49
- ),
50
- schema="dbos",
51
- )
52
-
53
-
54
- def downgrade() -> None:
55
- op.drop_table("job_queue", schema="dbos")
56
- op.drop_column("workflow_status", "queue_name", schema="dbos")
@@ -1,46 +0,0 @@
1
- """functionname_childid_op_outputs
2
-
3
- Revision ID: f4b9b32ba814
4
- Revises: 04ca4f231047
5
- Create Date: 2025-03-21 14:32:43.091074
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 = "f4b9b32ba814"
16
- down_revision: Union[str, None] = "04ca4f231047"
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
- op.add_column(
23
- "operation_outputs",
24
- sa.Column(
25
- "function_name",
26
- sa.Text(),
27
- nullable=False,
28
- server_default="",
29
- ),
30
- schema="dbos",
31
- )
32
-
33
- op.add_column(
34
- "operation_outputs",
35
- sa.Column(
36
- "child_workflow_id",
37
- sa.Text(),
38
- nullable=True,
39
- ),
40
- schema="dbos",
41
- )
42
-
43
-
44
- def downgrade() -> None:
45
- op.drop_column("operation_outputs", "function_name", schema="dbos")
46
- op.drop_column("operation_outputs", "child_workflow_id", schema="dbos")
@@ -1,116 +0,0 @@
1
- # A generic, single database configuration.
2
-
3
- [alembic]
4
- # path to migration scripts
5
- # Use forward slashes (/) also on windows to provide an os agnostic path
6
- script_location = migrations
7
-
8
- # template used to generate migration file names; The default value is %%(rev)s_%%(slug)s
9
- # Uncomment the line below if you want the files to be prepended with date and time
10
- # see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file
11
- # for all available tokens
12
- file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d%%(second).2d_%%(slug)s
13
-
14
- # sys.path path, will be prepended to sys.path if present.
15
- # defaults to the current working directory.
16
- prepend_sys_path = .
17
-
18
- # timezone to use when rendering the date within the migration file
19
- # as well as the filename.
20
- # If specified, requires the python>=3.9 or backports.zoneinfo library.
21
- # Any required deps can installed by adding `alembic[tz]` to the pip requirements
22
- # string value is passed to ZoneInfo()
23
- # leave blank for localtime
24
- # timezone =
25
-
26
- # max length of characters to apply to the "slug" field
27
- # truncate_slug_length = 40
28
-
29
- # set to 'true' to run the environment during
30
- # the 'revision' command, regardless of autogenerate
31
- # revision_environment = false
32
-
33
- # set to 'true' to allow .pyc and .pyo files without
34
- # a source .py file to be detected as revisions in the
35
- # versions/ directory
36
- # sourceless = false
37
-
38
- # version location specification; This defaults
39
- # to migrations/versions. When using multiple version
40
- # directories, initial revisions must be specified with --version-path.
41
- # The path separator used here should be the separator specified by "version_path_separator" below.
42
- # version_locations = %(here)s/bar:%(here)s/bat:migrations/versions
43
-
44
- # version path separator; As mentioned above, this is the character used to split
45
- # version_locations. The default within new alembic.ini files is "os", which uses os.pathsep.
46
- # If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas.
47
- # Valid values for version_path_separator are:
48
- #
49
- # version_path_separator = :
50
- # version_path_separator = ;
51
- # version_path_separator = space
52
- version_path_separator = os # Use os.pathsep. Default configuration used for new projects.
53
-
54
- # set to 'true' to search source files recursively
55
- # in each "version_locations" directory
56
- # new in Alembic version 1.10
57
- # recursive_version_locations = false
58
-
59
- # the output encoding used when revision files
60
- # are written from script.py.mako
61
- # output_encoding = utf-8
62
-
63
- # sqlalchemy.url is set in env.py from the dbos-config.yaml file
64
-
65
-
66
- [post_write_hooks]
67
- # post_write_hooks defines scripts or Python functions that are run
68
- # on newly generated revision scripts. See the documentation for further
69
- # detail and examples
70
-
71
- # format using "black" - use the console_scripts runner, against the "black" entrypoint
72
- # hooks = black
73
- # black.type = console_scripts
74
- # black.entrypoint = black
75
- # black.options = -l 79 REVISION_SCRIPT_FILENAME
76
-
77
- # lint with attempts to fix using "ruff" - use the exec runner, execute a binary
78
- # hooks = ruff
79
- # ruff.type = exec
80
- # ruff.executable = %(here)s/.venv/bin/ruff
81
- # ruff.options = --fix REVISION_SCRIPT_FILENAME
82
-
83
- # Logging configuration
84
- [loggers]
85
- keys = root,sqlalchemy,alembic
86
-
87
- [handlers]
88
- keys = console
89
-
90
- [formatters]
91
- keys = generic
92
-
93
- [logger_root]
94
- level = WARN
95
- handlers = console
96
- qualname =
97
-
98
- [logger_sqlalchemy]
99
- level = WARN
100
- handlers =
101
- qualname = sqlalchemy.engine
102
-
103
- [logger_alembic]
104
- level = INFO
105
- handlers =
106
- qualname = alembic
107
-
108
- [handler_console]
109
- class = StreamHandler
110
- args = (sys.stderr,)
111
- level = NOTSET
112
- formatter = generic
113
-
114
- [formatter_generic]
115
- format = %(levelname)-5.5s [%(name)s] %(message)s
116
- datefmt = %H:%M:%S
@@ -1,85 +0,0 @@
1
- import re
2
- import os
3
- from logging.config import fileConfig
4
-
5
- from alembic import context
6
- from sqlalchemy import engine_from_config, pool
7
-
8
- # this is the Alembic Config object, which provides
9
- # access to the values within the .ini file in use.
10
- config = context.config
11
-
12
- # Interpret the config file for Python logging.
13
- # This line sets up loggers basically.
14
- if config.config_file_name is not None:
15
- fileConfig(config.config_file_name)
16
-
17
- # Programmatically set the sqlalchemy.url field to the DBOS application database URL
18
- conn_string = os.environ.get("DBOS_DATABASE_URL", "postgresql+psycopg://postgres:dbos@localhost:5432/${default_db_name}?connect_timeout=5")
19
- # Alembic requires the % in URL-escaped parameters to itself be escaped to %%
20
- escaped_conn_string = re.sub(
21
- r"%(?=[0-9A-Fa-f]{2})",
22
- "%%",
23
- conn_string,
24
- )
25
- config.set_main_option("sqlalchemy.url", escaped_conn_string)
26
-
27
- # add your model's MetaData object here
28
- # for 'autogenerate' support
29
- from ${package_name}.schema import metadata
30
- target_metadata = metadata
31
-
32
- # other values from the config, defined by the needs of env.py,
33
- # can be acquired:
34
- # my_important_option = config.get_main_option("my_important_option")
35
- # ... etc.
36
-
37
-
38
- def run_migrations_offline() -> None:
39
- """Run migrations in 'offline' mode.
40
-
41
- This configures the context with just a URL
42
- and not an Engine, though an Engine is acceptable
43
- here as well. By skipping the Engine creation
44
- we don't even need a DBAPI to be available.
45
-
46
- Calls to context.execute() here emit the given string to the
47
- script output.
48
-
49
- """
50
- url = config.get_main_option("sqlalchemy.url")
51
- context.configure(
52
- url=url,
53
- target_metadata=target_metadata,
54
- literal_binds=True,
55
- dialect_opts={"paramstyle": "named"},
56
- )
57
-
58
- with context.begin_transaction():
59
- context.run_migrations()
60
-
61
-
62
- def run_migrations_online() -> None:
63
- """Run migrations in 'online' mode.
64
-
65
- In this scenario we need to create an Engine
66
- and associate a connection with the context.
67
-
68
- """
69
- connectable = engine_from_config(
70
- config.get_section(config.config_ini_section, {}),
71
- prefix="sqlalchemy.",
72
- poolclass=pool.NullPool,
73
- )
74
-
75
- with connectable.connect() as connection:
76
- context.configure(connection=connection, target_metadata=target_metadata)
77
-
78
- with context.begin_transaction():
79
- context.run_migrations()
80
-
81
-
82
- if context.is_offline_mode():
83
- run_migrations_offline()
84
- else:
85
- run_migrations_online()
@@ -1,26 +0,0 @@
1
- """${message}
2
-
3
- Revision ID: ${up_revision}
4
- Revises: ${down_revision | comma,n}
5
- Create Date: ${create_date}
6
-
7
- """
8
- from typing import Sequence, Union
9
-
10
- from alembic import op
11
- import sqlalchemy as sa
12
- ${imports if imports else ""}
13
-
14
- # revision identifiers, used by Alembic.
15
- revision: str = ${repr(up_revision)}
16
- down_revision: Union[str, None] = ${repr(down_revision)}
17
- branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)}
18
- depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)}
19
-
20
-
21
- def upgrade() -> None:
22
- ${upgrades if upgrades else "pass"}
23
-
24
-
25
- def downgrade() -> None:
26
- ${downgrades if downgrades else "pass"}
@@ -1,35 +0,0 @@
1
- """
2
- Initialize application database.
3
-
4
- Revision ID: c6b516e182b2
5
- Revises:
6
- Create Date: 2024-07-31 18:06:42.500040
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 = "c6b516e182b2"
16
- down_revision: Union[str, None] = None
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
- # ### commands auto generated by Alembic - please adjust! ###
23
- op.create_table(
24
- "dbos_hello",
25
- sa.Column("greet_count", sa.Integer(), autoincrement=True, nullable=False),
26
- sa.Column("name", sa.String(), nullable=False),
27
- sa.PrimaryKeyConstraint("greet_count"),
28
- )
29
- # ### end Alembic commands ###
30
-
31
-
32
- def downgrade() -> None:
33
- # ### commands auto generated by Alembic - please adjust! ###
34
- op.drop_table("dbos_hello")
35
- # ### end Alembic commands ###