Add ability to literal compile a :class:`DateTime`, :class:`Date`
or :class:"Time" when using the string dialect for debugging purposes.
This change does not impact real dialect implementation that retain
their current behavior.
Fixes: #5052
Change-Id: Ia3fad2be905c6d35b0106b9a2388c7508f067e90
(cherry picked from commit
83eb1b23cbe5a7ee0f2534256cf16f0f865bdbbb)
--- /dev/null
+.. change::
+ :tags: sql, types
+ :tickets: 5052
+
+ Add ability to literal compile a :class:`DateTime`, :class:`Date`
+ or :class:"Time" when using the string dialect for debugging purposes.
+ This change does not impact real dialect implementation that retain
+ their current behavior.
return name
+class _RendersLiteral(object):
+ def literal_processor(self, dialect):
+ def process(value):
+ return "'%s'" % value
+
+ return process
+
+
+class _StrDateTime(_RendersLiteral, sqltypes.DateTime):
+ pass
+
+
+class _StrDate(_RendersLiteral, sqltypes.Date):
+ pass
+
+
+class _StrTime(_RendersLiteral, sqltypes.Time):
+ pass
+
+
class StrCompileDialect(DefaultDialect):
statement_compiler = compiler.StrSQLCompiler
supports_simple_order_by_label = True
+ colspecs = {
+ sqltypes.DateTime: _StrDateTime,
+ sqltypes.Date: _StrDate,
+ sqltypes.Time: _StrTime,
+ }
+
class DefaultExecutionContext(interfaces.ExecutionContext):
isinsert = False
"""
+import datetime
import decimal
from sqlalchemy import alias
from sqlalchemy import String
from sqlalchemy import subquery
from sqlalchemy import Table
+from sqlalchemy import testing
from sqlalchemy import Text
from sqlalchemy import text
from sqlalchemy import TIMESTAMP
"WITHIN GROUP (ORDER BY mytable.name DESC) AS anon_1 FROM mytable",
)
+ @testing.combinations(
+ ("datetime", datetime.datetime.now()),
+ ("date", datetime.date.today()),
+ ("time", datetime.time()),
+ argnames="value",
+ id_="ia",
+ )
+ def test_render_datetime(self, value):
+ lit = literal(value)
+
+ eq_ignore_whitespace(
+ str(lit.compile(compile_kwargs={"literal_binds": True})),
+ "'%s'" % value,
+ )
+
class KwargPropagationTest(fixtures.TestBase):
@classmethod
)
assert isinstance(thang_table.c.name.type, Unicode)
thang_table.create()
+
+
+class LiteralTest(fixtures.TestBase):
+ __backend__ = True
+
+ @testing.combinations(
+ ("datetime", datetime.datetime.now()),
+ ("date", datetime.date.today()),
+ ("time", datetime.time()),
+ argnames="value",
+ id_="ia",
+ )
+ @testing.skip_if(lambda: testing.requires.datetime_literals)
+ def test_render_datetime(self, value):
+ lit = literal(value)
+
+ assert_raises_message(
+ NotImplementedError,
+ "Don't know how to literal-quote value.*",
+ lit.compile,
+ dialect=testing.db.dialect,
+ compile_kwargs={"literal_binds": True},
+ )