else:
default = self.get_column_default_string(column)
if default is not None:
- colspec.append("DEFAULT " + default)
+ if (
+ isinstance(
+ column.server_default.arg, functions.FunctionElement
+ )
+ and self.dialect._support_default_function
+ ):
+ colspec.append(f"DEFAULT ({default})")
+ else:
+ colspec.append("DEFAULT " + default)
return " ".join(colspec)
def post_create_table(self, table):
# ref https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-17.html#mysqld-8-0-17-feature # noqa
return self.server_version_info >= (8, 0, 17)
+ @property
+ def _support_default_function(self):
+ if not self.server_version_info:
+ return False
+ elif self.is_mariadb:
+ # ref https://mariadb.com/kb/en/mariadb-1021-release-notes/
+ return self.server_version_info >= (10, 2, 1)
+ else:
+ # ref https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html # noqa
+ return self.server_version_info >= (8, 0, 13)
+
@property
def _is_mariadb(self):
return self.is_mariadb
from sqlalchemy import INT
from sqlalchemy import Integer
from sqlalchemy import Interval
+from sqlalchemy import JSON
from sqlalchemy import LargeBinary
from sqlalchemy import literal
from sqlalchemy import MetaData
"PRIMARY KEY (data) USING btree)",
)
+ @testing.combinations(
+ (True, True, (10, 2, 2)),
+ (True, True, (10, 2, 1)),
+ (False, True, (10, 2, 0)),
+ (True, False, (8, 0, 14)),
+ (True, False, (8, 0, 13)),
+ (False, False, (8, 0, 12)),
+ argnames="has_brackets,is_mariadb,version",
+ )
+ def test_create_server_default_with_function_using(
+ self, has_brackets, is_mariadb, version
+ ):
+ dialect = mysql.dialect(is_mariadb=is_mariadb)
+ dialect.server_version_info = version
+
+ m = MetaData()
+ tbl = Table(
+ "testtbl",
+ m,
+ Column("time", DateTime, server_default=func.current_timestamp()),
+ Column("name", String(255), server_default="some str"),
+ Column(
+ "description", String(255), server_default=func.lower("hi")
+ ),
+ Column("data", JSON, server_default=func.json_object()),
+ )
+
+ eq_(dialect._support_default_function, has_brackets)
+
+ if has_brackets:
+ self.assert_compile(
+ schema.CreateTable(tbl),
+ "CREATE TABLE testtbl ("
+ "time DATETIME DEFAULT (CURRENT_TIMESTAMP), "
+ "name VARCHAR(255) DEFAULT 'some str', "
+ "description VARCHAR(255) DEFAULT (lower('hi')), "
+ "data JSON DEFAULT (json_object()))",
+ dialect=dialect,
+ )
+ else:
+ self.assert_compile(
+ schema.CreateTable(tbl),
+ "CREATE TABLE testtbl ("
+ "time DATETIME DEFAULT CURRENT_TIMESTAMP, "
+ "name VARCHAR(255) DEFAULT 'some str', "
+ "description VARCHAR(255) DEFAULT lower('hi'), "
+ "data JSON DEFAULT json_object())",
+ dialect=dialect,
+ )
+
def test_create_index_expr(self):
m = MetaData()
t1 = Table("foo", m, Column("x", Integer))