Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
2a69429
refactor(mysql): inherit inline-index capability from core and unify …
vistart Sep 19, 2026
17f3538
fix(mysql): declare format_index_definition in MySQLTableSupport
vistart Sep 19, 2026
b34c993
test(mysql): cover inline index rendering from derived DDL
vistart Sep 19, 2026
91fa826
test(mysql): import Annotated with typing_extensions fallback on Pyth…
vistart Sep 19, 2026
aca2cb1
refactor(mysql): derive partition definitions from generic base decla…
vistart Sep 20, 2026
102cad6
test(mysql): assert subpartition empty name rejected at construction
vistart Sep 20, 2026
aef164f
feat(mysql): add MySQLColumnDefinition and typed column options
vistart Sep 20, 2026
752d94b
feat(mysql): add MySQLCreateTableOptions and read typed table options
vistart Sep 20, 2026
3a5d48e
test(mysql): migrate table options tests to typed CreateTableOptions
vistart Sep 20, 2026
95bc5dd
refactor(mysql): add MySQLAddColumn with typed after field
vistart Sep 20, 2026
ec68a62
refactor(mysql): add MySQLInsertExpression with typed ignore/replace
vistart Sep 20, 2026
0cfe2c5
refactor(mysql): type partition definition options, drop dialect_opti…
vistart Sep 20, 2026
4e36e0c
refactor(mysql): drop reserved dialect_options bag from DDL/admin exp…
vistart Sep 20, 2026
6f40678
refactor(mysql): drop dialect_options from data-type value objects
vistart Sep 20, 2026
ba64d13
fix(mysql): gate CREATE VIEW WITH CHECK OPTION on supports_view_check…
vistart Sep 20, 2026
0e2cf2a
feat(mysql): version-aware charset/collation/storage-engine protocol …
vistart Sep 20, 2026
30f7d62
refactor(mysql): move collation whitelist into the dialect mixin
vistart Sep 20, 2026
82ad8dd
docs(mysql): update INSERT IGNORE example to typed MySQLInsertExpression
vistart Sep 20, 2026
aa14e7f
docs(mysql): purge stale dialect_options references
vistart Sep 20, 2026
d0a9338
feat(mysql): typed AUTO_INCREMENT / ROW_FORMAT table options
vistart Sep 20, 2026
a2f8a3e
fix(mysql): wire MySQLDatabaseMixin into the dialect
vistart Sep 20, 2026
f871377
docs(mysql): update examples to typed table options (drop dialect_opt…
vistart Sep 20, 2026
e94cd63
refactor(ddl): drop legacy identity fields from column classes
vistart Sep 21, 2026
3e1a8e4
feat(ddl): render column attributes; backend identity syntax
vistart Sep 21, 2026
b594ee8
test(ddl): classify ColumnAttributeSupport; use deriver.creation_plan()
vistart Sep 21, 2026
37c32da
refactor(ddl): use core typed comment clause nodes
vistart Sep 23, 2026
c47994f
fix(ddl): declare supports_column_comment in MySQLTableSupport
vistart Sep 23, 2026
43e606d
test: drop redundant __primary_key__ = "id" from fixtures
vistart Sep 23, 2026
64cdca5
fix(ddl): stop silently dropping TABLESPACE / INHERITS
vistart Sep 23, 2026
09575ff
feat(mysql): add type domain negative contract
vistart Sep 24, 2026
19ead3f
test(ddl): cover table inheritance and tablespace
vistart Sep 24, 2026
ada2c00
feat(mysql): add partition lifecycle provider
vistart Sep 25, 2026
a5cdb55
fix(mysql): update DDL imports for namespace split
vistart Sep 25, 2026
24933ce
fix(mysql): declare partition lifecycle provider protocol
vistart Sep 25, 2026
89d5bd4
refactor(mysql): remove generated DDL lifecycle
vistart Sep 25, 2026
e3fcefd
docs: document repository search scope
vistart Sep 25, 2026
0f20e67
fix(protocol): declare partition support capabilities
vistart Sep 25, 2026
30daa0c
test(ddl): cover DDLSource collection
vistart Sep 25, 2026
9c6dd57
fix(backend): repair unresolvable TYPE_CHECKING imports
vistart Sep 27, 2026
39bdb64
chore(test): register the pytest markers the suite already uses
vistart Sep 27, 2026
bde82d7
fix(scripts): stop the pre-commit hook from blocking commits on older…
vistart Sep 27, 2026
cbd1470
ci: install core and testsuite from release branches
vistart Sep 27, 2026
91b89e0
chore: add changelog fragment for PR #56
vistart Sep 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
- name: Install activerecord and testsuite
run: |
pip install "rhosocial-activerecord @ git+https://github.com/rhosocial/python-activerecord.git@release/v1.0.0.dev30"
pip install "rhosocial-activerecord-testsuite @ git+https://github.com/rhosocial/python-activerecord-testsuite.git@feature/activerecord-derived-ddl"
pip install "rhosocial-activerecord-testsuite @ git+https://github.com/rhosocial/python-activerecord-testsuite.git@release/v1.0.0.dev17"

Check warning on line 61 in .github/workflows/test.yml

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Using dependencies without locking resolved versions is security-sensitive.

See more on https://sonarcloud.io/project/issues?id=rhosocial_python-activerecord-mysql&issues=AaDh8f1ZobAzMXtwQErQ&open=AaDh8f1ZobAzMXtwQErQ&pullRequest=56

- name: Create and test database
run: |
Expand Down Expand Up @@ -249,7 +249,7 @@
- name: Install activerecord and testsuite
run: |
pip install "rhosocial-activerecord @ git+https://github.com/rhosocial/python-activerecord.git@release/v1.0.0.dev30"
pip install "rhosocial-activerecord-testsuite @ git+https://github.com/rhosocial/python-activerecord-testsuite.git@feature/activerecord-derived-ddl"
pip install "rhosocial-activerecord-testsuite @ git+https://github.com/rhosocial/python-activerecord-testsuite.git@release/v1.0.0.dev17"

Check warning on line 252 in .github/workflows/test.yml

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Using dependencies without locking resolved versions is security-sensitive.

See more on https://sonarcloud.io/project/issues?id=rhosocial_python-activerecord-mysql&issues=AaDh8f1ZobAzMXtwQErS&open=AaDh8f1ZobAzMXtwQErS&pullRequest=56

Check warning on line 252 in .github/workflows/test.yml

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Omitting "--only-binary :all:" can lead to the execution of setup scripts. Make sure it is safe here.

See more on https://sonarcloud.io/project/issues?id=rhosocial_python-activerecord-mysql&issues=AaDh8f1ZobAzMXtwQErR&open=AaDh8f1ZobAzMXtwQErR&pullRequest=56

- name: Create and test database
run: |
Expand Down Expand Up @@ -356,7 +356,7 @@
- name: Install activerecord and testsuite
run: |
pip install "rhosocial-activerecord @ git+https://github.com/rhosocial/python-activerecord.git@release/v1.0.0.dev30"
pip install "rhosocial-activerecord-testsuite @ git+https://github.com/rhosocial/python-activerecord-testsuite.git@feature/activerecord-derived-ddl"
pip install "rhosocial-activerecord-testsuite @ git+https://github.com/rhosocial/python-activerecord-testsuite.git@release/v1.0.0.dev17"

Check warning on line 359 in .github/workflows/test.yml

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Omitting "--only-binary :all:" can lead to the execution of setup scripts. Make sure it is safe here.

See more on https://sonarcloud.io/project/issues?id=rhosocial_python-activerecord-mysql&issues=AaDh8f1ZobAzMXtwQErT&open=AaDh8f1ZobAzMXtwQErT&pullRequest=56

Check warning on line 359 in .github/workflows/test.yml

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Using dependencies without locking resolved versions is security-sensitive.

See more on https://sonarcloud.io/project/issues?id=rhosocial_python-activerecord-mysql&issues=AaDh8f1ZobAzMXtwQErU&open=AaDh8f1ZobAzMXtwQErU&pullRequest=56

- name: Create and test database
run: |
Expand Down
8 changes: 7 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,10 @@ This project is under active development. Key features implemented:

## Version Control and Changelog

This project adheres to the same version control, branching, commit message, and changelog management standards as the main `python-activerecord` project.
This project adheres to the same version control, branching, commit message, and changelog management standards as the main `python-activerecord` project.

## Search Scope

- Use `rg` for repository searches; never use `grep`.
- Limit searches to this `python-activerecord` repository and its related testsuite/backend directories.
- Exclude `.git/`, `.venv*/`, `__pycache__/`, `build/`, `dist/`, and other cache directories.
1 change: 1 addition & 0 deletions changelog.d/56.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Adapt the MySQL backend to derived DDL with typed table and column options: `MySQLColumnDefinition`, `MySQLCreateTableOptions` with typed `AUTO_INCREMENT` and `ROW_FORMAT`, a partition lifecycle provider with validated subpartition names, a version-aware charset/collation/storage-engine protocol, `MySQLInsertExpression` with typed `IGNORE`/`REPLACE`, and `MySQLAddColumn` with a typed `after` field. Add a type-domain negative contract plus coverage for `DDLSource` collection, table inheritance, tablespace and inline-index rendering.
1 change: 1 addition & 0 deletions changelog.d/56.internal.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Install core and testsuite from release branches in CI instead of the derived-DDL feature branch, repair TYPE_CHECKING imports broken by the expression namespace split, register the pytest markers the suite already uses, and stop the pre-commit hook from blocking commits on revisions that predate `scripts/preflight.sh`.
1 change: 1 addition & 0 deletions changelog.d/56.removed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Remove the reserved `dialect_options` bag from data-type value objects, DDL and admin expressions, and partition definitions, along with the legacy identity fields on column classes.
3 changes: 3 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,9 @@ markers = [
"benchmark_sync: marks sync benchmark tests",
"benchmark_write: marks write benchmark tests",
"benchmark_read: marks read benchmark tests",
"feature: category label for feature-area tests; changes collection grouping only, not ordering",
"benchmark_relation: marks relation benchmarks; changes collection grouping only, not ordering",

]

[tool.coverage.run]
Expand Down
31 changes: 26 additions & 5 deletions scripts/install-git-hooks.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,42 @@
# Installs an optional pre-commit hook that runs scripts/preflight.sh so a
# broken import/lint is caught before the commit (and before a CI round-trip).
# Bypass a single commit with: git commit --no-verify
#
# Re-run this after pulling, and re-run it from the repository root. To remove
# the hook, delete .git/hooks/pre-commit (or the core.hooksPath directory).
set -euo pipefail

cd "$(dirname "$0")/.."

HOOK=".git/hooks/pre-commit"
if [ ! -d .git/hooks ]; then
echo "install-git-hooks: .git/hooks not found (not a git repo?)" >&2
exit 2
# git ignores .git/hooks entirely once core.hooksPath is set, so a hook written
# there would never run while this script still reported success.
HOOKS_PATH="$(git config core.hooksPath || true)"
if [ -n "$HOOKS_PATH" ]; then

Check failure on line 17 in scripts/install-git-hooks.sh

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Use '[[' instead of '[' for conditional tests. The '[[' construct is safer and more feature-rich.

See more on https://sonarcloud.io/project/issues?id=rhosocial_python-activerecord-mysql&issues=AaDh8f2aobAzMXtwQErV&open=AaDh8f2aobAzMXtwQErV&pullRequest=56
echo "install-git-hooks: core.hooksPath is set to '$HOOKS_PATH'." >&2
echo "install-git-hooks: .git/hooks is ignored by git; writing the hook to" >&2
echo " '$HOOKS_PATH/pre-commit' instead." >&2
HOOK="$HOOKS_PATH/pre-commit"
mkdir -p "$HOOKS_PATH"
else
HOOK=".git/hooks/pre-commit"
if [ ! -d .git/hooks ]; then
echo "install-git-hooks: .git/hooks not found (not a git repo?)" >&2
exit 2
fi
fi

cat > "$HOOK" <<'HOOK_BODY'
#!/usr/bin/env bash
# Installed by scripts/install-git-hooks.sh — runs the local pre-flight.
# Skip with: git commit --no-verify
exec "$(git rev-parse --show-toplevel)/scripts/preflight.sh"
#
# The guard below matters on older revisions: this hook is a local, untracked
# artifact, so it survives a checkout of a commit that predates
# scripts/preflight.sh. Without the guard, exec fails with a bare
# "No such file or directory" and blocks the commit with nothing to act on.
PREFLIGHT="$(git rev-parse --show-toplevel)/scripts/preflight.sh"
[ -x "$PREFLIGHT" ] || exit 0
exec "$PREFLIGHT"
HOOK_BODY
chmod +x "$HOOK"

Expand Down
5 changes: 3 additions & 2 deletions src/rhosocial/activerecord/backend/impl/mysql/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
from .backend import MySQLBackend
from .async_backend import AsyncMySQLBackend
from .config import MySQLConnectionConfig
from .collation import MySQLCollation, MySQLCollationValidator
from .mixins.charset_collation import MySQLCharset, MySQLCollation, MySQLStorageEngine
from .dialect import MySQLDialect
from .transaction import MySQLTransactionManager
from .async_transaction import AsyncMySQLTransactionManager
Expand Down Expand Up @@ -158,7 +158,8 @@
# Dialect related
"MySQLDialect",
"MySQLCollation",
"MySQLCollationValidator",
"MySQLCharset",
"MySQLStorageEngine",
# Transaction - Sync and Async
"MySQLTransactionManager",
"AsyncMySQLTransactionManager",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from .mixins import MySQLTransactionMixin

if TYPE_CHECKING:
from .backend import AsyncMySQLBackend
from .async_backend import AsyncMySQLBackend


class AsyncMySQLTransactionManager(MySQLTransactionMixin, AsyncTransactionManager):
Expand Down
49 changes: 21 additions & 28 deletions src/rhosocial/activerecord/backend/impl/mysql/dialect.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,9 @@
based on the MySQL version provided at initialization.
"""

from typing import Any, Dict, List, Optional, Tuple, TYPE_CHECKING
from typing import Any, List, Optional, Tuple, TYPE_CHECKING

from rhosocial.activerecord.backend.dialect.base import SQLDialectBase
from rhosocial.activerecord.backend.expression.bases import ToSQLProtocol
from rhosocial.activerecord.backend.dialect.protocols import (
CollationSupport,
CTESupport,
Expand All @@ -36,7 +35,9 @@
TruncateSupport,
TransactionControlSupport,
SQLFunctionSupport,
DDLTypeSupport,
DataTypeSupport,
UserDefinedTypeSupport,
DomainSupport,
)
from rhosocial.activerecord.backend.dialect.mixins import (
CollationMixin,
Expand Down Expand Up @@ -70,10 +71,11 @@
DQLMixin,
DMLMixin,
DDLColumnMixin,
UserDefinedTypeMixin,
DomainMixin,
TransactionControlMixin,
SetOperationMixin,
)
from rhosocial.activerecord.backend.dialect.exceptions import UnsupportedFeatureError
from .protocols import (
MySQLTriggerSupport,
MySQLTableSupport,
Expand Down Expand Up @@ -120,7 +122,7 @@
MySQLLoadXMLLMixin,
MySQLAdminCommandMixin,
MySQLDateTimeMixin,
MySQLCollationMixin,
MySQLCharsetCollationMixin,
MySQLCTEMixin,
MySQLWindowMixin,
MySQLGroupingMixin,
Expand All @@ -131,6 +133,7 @@
MySQLDDLColumnMixin,
MySQLViewMixin,
MySQLSchemaMixin,
MySQLDatabaseMixin,
MySQLConstraintMixin,
MySQLGeneratedColumnMixin,
MySQLFunctionMixin,
Expand All @@ -139,32 +142,16 @@
from .show.dialect import MySQLShowDialectMixin

if TYPE_CHECKING:
from rhosocial.activerecord.backend.expression.collation import CollateExpression
from rhosocial.activerecord.backend.expression.statements import (
CreateTableExpression,
CreateViewExpression,
DropViewExpression,
ExplainExpression,
InsertExpression,
)
from rhosocial.activerecord.backend.expression.statements.fulltext_match import (
FulltextMatchExpression,
)
from rhosocial.activerecord.backend.expression.statements.ddl_trigger import (
CreateTriggerExpression,
DropTriggerExpression,
)
from rhosocial.activerecord.backend.expression.transaction import (
SetTransactionExpression,
BeginTransactionExpression,
)


class MySQLDialect(
SQLDialectBase,
# MySQL-specific mixins (before generic mixins to override methods)
MySQLDateTimeMixin,
MySQLCollationMixin,
MySQLCharsetCollationMixin,
MySQLCTEMixin,
MySQLWindowMixin,
MySQLGroupingMixin,
Expand All @@ -175,6 +162,7 @@ class MySQLDialect(
MySQLDDLColumnMixin,
MySQLViewMixin,
MySQLSchemaMixin,
MySQLDatabaseMixin,
MySQLConstraintMixin,
MySQLGeneratedColumnMixin,
MySQLFunctionMixin,
Expand Down Expand Up @@ -221,6 +209,8 @@ class MySQLDialect(
MySQLModifyColumnMixin,
MySQLJsonDualityViewMixin,
MySQLTypeSupportMixin,
UserDefinedTypeMixin,
DomainMixin,
MySQLOptimizerHintMixin,
MySQLTableStatementMixin,
MySQLMaintenanceMixin,
Expand Down Expand Up @@ -281,7 +271,9 @@ class MySQLDialect(
MySQLLoadXMLSupport,
MySQLAdminCommandSupport,
SQLFunctionSupport,
DDLTypeSupport,
DataTypeSupport,
UserDefinedTypeSupport,
DomainSupport,
):
"""
MySQL dialect implementation that adapts to the MySQL version.
Expand Down Expand Up @@ -411,9 +403,10 @@ def get_upsert_syntax_type(self) -> str:
def format_insert_statement(self, expr: "InsertExpression") -> Tuple[str, tuple]:
"""Format INSERT statement with MySQL-specific options.

Extends the base implementation to support:
- INSERT IGNORE via dialect_options={'ignore': True}
- REPLACE INTO via dialect_options={'replace': True}
Extends the base implementation to support the typed flags on
``MySQLInsertExpression``:
- ``ignore=True`` → ``INSERT IGNORE``
- ``replace=True`` → ``REPLACE INTO``

Args:
expr: InsertExpression instance
Expand All @@ -430,8 +423,8 @@ def format_insert_statement(self, expr: "InsertExpression") -> Tuple[str, tuple]
expr.validate(strict=True)

# Check for conflicting options
is_replace = expr.dialect_options.get("replace", False)
is_ignore = expr.dialect_options.get("ignore", False)
is_replace = getattr(expr, "replace", False)
is_ignore = getattr(expr, "ignore", False)

if is_replace and is_ignore:
raise ValueError("Cannot use both 'replace' and 'ignore' options together")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import os
from rhosocial.activerecord.backend.impl.mysql import MySQLBackend
from rhosocial.activerecord.backend.impl.mysql.config import MySQLConnectionConfig
from rhosocial.activerecord.backend.impl.mysql.expression import MySQLCreateTableOptions
from rhosocial.activerecord.backend.expression import (
DropTableExpression,
CreateTableExpression,
Expand All @@ -41,7 +42,7 @@
dialect = backend.dialect

# Drop if exists for clean setup
drop = DropTableExpression(dialect=dialect, table_name="products", if_exists=True)
drop = DropTableExpression(dialect=dialect, table="products", if_exists=True)
sql, params = drop.to_sql()
backend.execute(sql, params)

Expand Down Expand Up @@ -102,14 +103,11 @@
# Create table with MySQL-specific ENGINE and CHARSET options
create_expr = CreateTableExpression(
dialect=dialect,
table_name="products",
table="products",
columns=columns,
indexes=indexes,
if_not_exists=True,
dialect_options={
"engine": "InnoDB",
"charset": "utf8mb4",
},
table_options=MySQLCreateTableOptions(dialect, engine="InnoDB", charset="utf8mb4"),
)

sql, params = create_expr.to_sql()
Expand All @@ -131,7 +129,7 @@
# ============================================================
# SECTION: Teardown (necessary for execution, reference only)
# ============================================================
drop_table = DropTableExpression(dialect=dialect, table_name="products", if_exists=True)
drop_table = DropTableExpression(dialect=dialect, table="products", if_exists=True)
sql, params = drop_table.to_sql()
backend.execute(sql, params)
backend.disconnect()
Expand All @@ -141,7 +139,7 @@
# ============================================================
# Key points:
# 1. Use ColumnConstraint with is_auto_increment=True for AUTO_INCREMENT
# 2. MySQL dialect_options supports 'engine' and 'charset' keys
# 2. MySQL table options (engine/charset) are typed on MySQLCreateTableOptions
# 3. IndexDefinition creates inline indexes within CREATE TABLE
# 4. Use current_timestamp(dialect) for SQL niladic functions (no parentheses)
# 5. Use introspector.get_columns() to verify table structure
Original file line number Diff line number Diff line change
Expand Up @@ -67,15 +67,18 @@
MySQLSchemaDiffer,
)
from rhosocial.activerecord.backend.expression.statements.ddl_alter import ( # noqa: E402
AlterTableExpression, AddColumn,
AlterTableExpression,
)
from rhosocial.activerecord.backend.impl.mysql.expression import ( # noqa: E402
MySQLAddColumn,
)

builder = SyncSchemaSnapshotBuilder(backend.introspector, dialect)
snapshot_before = builder.build()

# Add `age` column between `name` and `email` — shifts email to position 4
add_col = AddColumn(dialect, ColumnDefinition(dialect, "age", IntegerType(dialect)),
dialect_options={"after": "name"})
add_col = MySQLAddColumn(dialect, ColumnDefinition(dialect, "age", IntegerType(dialect)),
after="name")
alter_expr = AlterTableExpression(dialect, "users", [add_col])
sql, params = alter_expr.to_sql()
backend.execute(sql, params)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import os
from rhosocial.activerecord.backend.impl.mysql import MySQLBackend
from rhosocial.activerecord.backend.impl.mysql.config import MySQLConnectionConfig
from rhosocial.activerecord.backend.impl.mysql.expression import MySQLCreateTableOptions
from rhosocial.activerecord.backend.expression import (
CreateTableExpression,
DropTableExpression,
Expand Down Expand Up @@ -78,7 +79,7 @@
),
],
if_not_exists=True,
dialect_options={"engine": "InnoDB"},
table_options=MySQLCreateTableOptions(dialect, engine="InnoDB"),
)
sql, params = create_table.to_sql()
backend.execute(sql, params)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
backend.connect()
dialect = backend.dialect

from rhosocial.activerecord.backend.impl.mysql.expression import MySQLCreateTableOptions
from rhosocial.activerecord.backend.expression import ( # noqa: E402
CreateTableExpression,
InsertExpression,
Expand Down Expand Up @@ -81,7 +82,7 @@
),
],
if_not_exists=True,
dialect_options={"engine": "InnoDB"},
table_options=MySQLCreateTableOptions(dialect, engine="InnoDB"),
)
sql, params = create_table.to_sql()
backend.execute(sql, params)
Expand Down
Loading
Loading