# this would have been set by the default dialect already,
# so set it again
self.identifier_preparer = self.preparer(self)
+
+ # this will be updated on first connect in initialize()
+ # if using older mariadb version
+ self.delete_returning = True
+ self.insert_returning = True
+
self.is_mariadb = is_mariadb
def do_begin_twophase(self, connection, xid):
tuple_in_values = True
supports_statement_cache = True
insert_null_pk_still_autoincrements = True
+ insert_returning = True
+ update_returning = True
+ delete_returning = True
default_paramstyle = "qmark"
execution_ctx_cls = SQLiteExecutionContext
14,
)
- if self.dbapi.sqlite_version_info >= (3, 35):
+ if self.dbapi.sqlite_version_info < (3, 35):
self.update_returning = (
self.delete_returning
- ) = self.insert_returning = True
+ ) = self.insert_returning = False
_isolation_lookup = util.immutabledict(
{"READ UNCOMMITTED": 1, "SERIALIZABLE": 0}
type_compiler_cls = compiler.StrSQLTypeCompiler
preparer = compiler.IdentifierPreparer
+ insert_returning = True
+ update_returning = True
+ delete_returning = True
+
supports_statement_cache = True
supports_identity_columns = True
self.assert_compile(sql.false(), "0")
self.assert_compile(sql.true(), "1")
+ def test_plain_stringify_returning(self):
+ t = Table(
+ "t",
+ MetaData(),
+ Column("myid", Integer, primary_key=True),
+ Column("name", String, server_default="some str"),
+ Column("description", String, default=func.lower("hi")),
+ )
+ stmt = t.insert().values().return_defaults()
+ eq_ignore_whitespace(
+ str(stmt.compile(dialect=mssql.dialect())),
+ "INSERT INTO t (description) "
+ "OUTPUT inserted.myid, inserted.name, inserted.description "
+ "VALUES (lower(:lower_1))",
+ )
+
@testing.combinations(
("plain", "sometable", "sometable"),
("matched_square_brackets", "colo[u]r", "[colo[u]]r]"),
from sqlalchemy.testing import assert_raises_message
from sqlalchemy.testing import AssertsCompiledSQL
from sqlalchemy.testing import eq_
+from sqlalchemy.testing import eq_ignore_whitespace
from sqlalchemy.testing import expect_warnings
from sqlalchemy.testing import fixtures
from sqlalchemy.testing import mock
dialect=dialect,
)
+ def test_plain_stringify_returning(self):
+ t = Table(
+ "t",
+ MetaData(),
+ Column("myid", Integer, primary_key=True),
+ Column("name", String, server_default="some str"),
+ Column("description", String, default=func.lower("hi")),
+ )
+ stmt = t.insert().values().return_defaults()
+ eq_ignore_whitespace(
+ str(stmt.compile(dialect=mysql.dialect(is_mariadb=True))),
+ "INSERT INTO t (description) VALUES (lower(%s)) "
+ "RETURNING t.myid, t.name, t.description",
+ )
+ eq_ignore_whitespace(
+ str(stmt.compile(dialect=mysql.dialect())),
+ "INSERT INTO t (description) VALUES (lower(%s))",
+ )
+
def test_create_index_simple(self):
m = MetaData()
tbl = Table("testtbl", m, Column("data", String(255)))
assert reflected.comment == comment
assert reflected.kwargs["mysql_comment"] == comment
- assert reflected.kwargs["mysql_default charset"] == "utf8"
+ assert reflected.kwargs["mysql_default charset"] in (
+ "utf8",
+ "utf8mb3",
+ )
assert reflected.kwargs["mysql_avg_row_length"] == "3"
assert reflected.kwargs["mysql_connection"] == "fish"
self.assert_compile(sql.false(), "0")
self.assert_compile(sql.true(), "1")
+ def test_plain_stringify_returning(self):
+ t = Table(
+ "t",
+ MetaData(),
+ Column("myid", Integer, primary_key=True),
+ Column("name", String, server_default="some str"),
+ Column("description", String, default=func.lower("hi")),
+ )
+ stmt = t.insert().values().return_defaults()
+ eq_ignore_whitespace(
+ str(stmt.compile(dialect=oracle.OracleDialect())),
+ "INSERT INTO t (description) VALUES (lower(:lower_1)) "
+ "RETURNING t.myid, t.name, t.description "
+ "INTO :ret_0, :ret_1, :ret_2",
+ )
+
def test_owner(self):
meta = MetaData()
parent = Table(
from sqlalchemy.testing.assertions import assert_raises
from sqlalchemy.testing.assertions import assert_raises_message
from sqlalchemy.testing.assertions import AssertsCompiledSQL
+from sqlalchemy.testing.assertions import eq_ignore_whitespace
from sqlalchemy.testing.assertions import expect_warnings
from sqlalchemy.testing.assertions import is_
from sqlalchemy.util import OrderedDict
__dialect__ = postgresql.dialect()
+ def test_plain_stringify_returning(self):
+ t = Table(
+ "t",
+ MetaData(),
+ Column("myid", Integer, primary_key=True),
+ Column("name", String, server_default="some str"),
+ Column("description", String, default=func.lower("hi")),
+ )
+ stmt = t.insert().values().return_defaults()
+ eq_ignore_whitespace(
+ str(stmt.compile(dialect=postgresql.dialect())),
+ "INSERT INTO t (description) VALUES (lower(%(lower_1)s)) "
+ "RETURNING t.myid, t.name, t.description",
+ )
+
def test_update_returning(self):
dialect = postgresql.dialect()
table1 = table(
from sqlalchemy.testing import config
from sqlalchemy.testing import engines
from sqlalchemy.testing import eq_
+from sqlalchemy.testing import eq_ignore_whitespace
from sqlalchemy.testing import expect_raises
from sqlalchemy.testing import expect_warnings
from sqlalchemy.testing import fixtures
"INTEGER) AS anon_1 FROM t" % subst,
)
+ def test_plain_stringify_returning(self):
+ t = Table(
+ "t",
+ MetaData(),
+ Column("myid", Integer, primary_key=True),
+ Column("name", String, server_default="some str"),
+ Column("description", String, default=func.lower("hi")),
+ )
+ stmt = t.insert().values().return_defaults()
+ eq_ignore_whitespace(
+ str(stmt.compile(dialect=sqlite.SQLiteDialect())),
+ "INSERT INTO t (description) VALUES (lower(?)) "
+ "RETURNING myid, name, description",
+ )
+
def test_true_false(self):
self.assert_compile(sql.false(), "0")
self.assert_compile(sql.true(), "1")
stmt = table1.insert().values()
eq_ignore_whitespace(str(stmt), "INSERT INTO mytable () VALUES ()")
+ def test_insert_return_defaults(self):
+ t = Table(
+ "t",
+ MetaData(),
+ Column("myid", Integer, primary_key=True),
+ Column("name", String, server_default="some str"),
+ Column("description", String, default=func.lower("hi")),
+ )
+ stmt = t.insert().values().return_defaults()
+ eq_ignore_whitespace(
+ str(stmt),
+ "INSERT INTO t (description) VALUES (lower(:lower_1)) "
+ "RETURNING t.myid, t.name, t.description",
+ )
+
def test_multirow_insert(self):
stmt = table1.insert().values([{"myid": 1}, {"myid": 2}])
eq_ignore_whitespace(
)
stmt = table.insert().return_defaults().values(id=func.foobar())
- compiled = stmt.compile(dialect=sqlite.dialect(), column_keys=["data"])
+ dialect = sqlite.dialect()
+ dialect.insert_returning = False
+ compiled = stmt.compile(dialect=dialect, column_keys=["data"])
eq_(compiled.postfetch, [])
eq_(compiled.implicit_returning, [])
"INSERT INTO sometable (id, data) VALUES " "(foobar(), ?)",
checkparams={"data": "foo"},
params={"data": "foo"},
- dialect=sqlite.dialect(),
+ dialect=dialect,
)
def test_sql_expression_pk_autoinc_returning(self):