else:
raise NotImplementedError()
+ def fire_sequence(self, seq, type_):
+ return self._execute_scalar(
+ (
+ "select nextval(%s)"
+ % self.dialect.identifier_preparer.format_sequence(seq)
+ ),
+ type_,
+ )
+
class MySQLCompiler(compiler.SQLCompiler):
def visit_random_func(self, fn, **kw):
return "rand%s" % self.function_argspec(fn)
+ def visit_sequence(self, seq, **kw):
+ return "nextval(%s)" % self.preparer.format_sequence(seq)
+
def visit_sysdate_func(self, fn, **kw):
return "SYSDATE()"
supports_native_enum = True
+ supports_sequences = False # default for MySQL ...
+ # ... may be updated to True for MariaDB 10.3+ in initialize()
+
supports_sane_rowcount = True
supports_sane_multi_rowcount = False
supports_multivalues_insert = True
if rs:
rs.close()
+ def has_sequence(self, connection, sequence_name, schema=None):
+ if not schema:
+ schema = self.default_schema_name
+ # MariaDB implements sequences as a special type of table
+ #
+ # query uses `... LIKE :name ...` instead of `... = :name ...`
+ # because MariaDB was performing case-sensitive searches with `=`
+ # while those same searches with `LIKE` were case-insensitive
+ cursor = connection.execute(
+ sql.text(
+ "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES "
+ "WHERE TABLE_NAME LIKE :name AND "
+ "TABLE_SCHEMA LIKE :schema_name"
+ ),
+ name=self.denormalize_name(sequence_name),
+ schema_name=self.denormalize_name(schema),
+ )
+ return cursor.first() is not None
+
def initialize(self, connection):
self._connection_charset = self._detect_charset(connection)
self._detect_sql_mode(connection)
default.DefaultDialect.initialize(self, connection)
+ self.supports_sequences = (
+ self._is_mariadb and self.server_version_info >= (10, 3)
+ )
+
self._needs_correct_for_88718_96365 = (
not self._is_mariadb and self.server_version_info >= (8,)
)
go()
def test_col_w_sequence_non_autoinc_no_firing(self):
+ try:
+ if testing.db.engine.dialect._is_mariadb:
+ # bypass test per discussion in #4976
+ return
+ except:
+ pass
metadata = self.metadata
# plain autoincrement/PK table in the actual schema
Table("x", metadata, Column("set_id", Integer, primary_key=True))
"""test inserted_primary_key contains [None] when
pk_col=next_value(), implicit returning is not used."""
+ try:
+ if testing.db.engine.dialect._is_mariadb:
+ # bypass test per discussion in #4976
+ return
+ except:
+ pass
metadata = self.metadata
e = engines.testing_engine(options={"implicit_returning": False})
s = Sequence("my_sequence")
for s in (Sequence("my_seq"), Sequence("my_seq", optional=True)):
assert str(s.next_value().compile(dialect=testing.db.dialect)) in (
"nextval('my_seq')",
+ "nextval(my_seq)",
"gen_id(my_seq, 1)",
"my_seq.nextval",
)