diff options
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/dialects/mssql/base.py | 4 | ||||
| -rw-r--r-- | lib/sqlalchemy/dialects/mysql/base.py | 8 | ||||
| -rw-r--r-- | lib/sqlalchemy/dialects/postgresql/base.py | 40 | ||||
| -rw-r--r-- | lib/sqlalchemy/dialects/sqlite/base.py | 18 | ||||
| -rw-r--r-- | lib/sqlalchemy/ext/hybrid.py | 14 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/_elements_constructors.py | 16 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/dml.py | 4 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/functions.py | 30 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/selectable.py | 14 | ||||
| -rw-r--r-- | lib/sqlalchemy/sql/sqltypes.py | 2 |
10 files changed, 74 insertions, 76 deletions
diff --git a/lib/sqlalchemy/dialects/mssql/base.py b/lib/sqlalchemy/dialects/mssql/base.py index d373b3a44..a6a12f451 100644 --- a/lib/sqlalchemy/dialects/mssql/base.py +++ b/lib/sqlalchemy/dialects/mssql/base.py @@ -343,7 +343,7 @@ The :class:`.Sequence` object creates "real" sequences, i.e., >>> from sqlalchemy.schema import CreateSequence >>> from sqlalchemy.dialects import mssql >>> print(CreateSequence(Sequence("my_seq", start=1)).compile(dialect=mssql.dialect())) - CREATE SEQUENCE my_seq START WITH 1 + {printsql}CREATE SEQUENCE my_seq START WITH 1 For integer primary key generation, SQL Server's ``IDENTITY`` construct should generally be preferred vs. sequence. @@ -697,7 +697,7 @@ below:: >>> eng = create_engine("mssql+pymssql://mydsn", legacy_schema_aliasing=True) >>> print(account_table.select().compile(eng)) - SELECT account_1.id, account_1.info + {printsql}SELECT account_1.id, account_1.info FROM customer_schema.account AS account_1 This mode of behavior is now off by default, as it appears to have served diff --git a/lib/sqlalchemy/dialects/mysql/base.py b/lib/sqlalchemy/dialects/mysql/base.py index 1a0534490..50e0ec07e 100644 --- a/lib/sqlalchemy/dialects/mysql/base.py +++ b/lib/sqlalchemy/dialects/mysql/base.py @@ -553,7 +553,7 @@ the generative method :meth:`~.mysql.Insert.on_duplicate_key_update`: ... status='U' ... ) >>> print(on_duplicate_key_stmt) - {opensql}INSERT INTO my_table (id, data) VALUES (%s, %s) + {printsql}INSERT INTO my_table (id, data) VALUES (%s, %s) ON DUPLICATE KEY UPDATE data = VALUES(data), status = %s @@ -584,7 +584,7 @@ as values: ... ) >>> print(on_duplicate_key_stmt) - {opensql}INSERT INTO my_table (id, data) VALUES (%s, %s) + {printsql}INSERT INTO my_table (id, data) VALUES (%s, %s) ON DUPLICATE KEY UPDATE data = %s, updated_at = CURRENT_TIMESTAMP In a manner similar to that of :meth:`.UpdateBase.values`, other parameter @@ -613,7 +613,7 @@ this context is unambiguous: ... ) >>> print(on_duplicate_key_stmt) - {opensql}INSERT INTO my_table (id, data) VALUES (%s, %s) + {printsql}INSERT INTO my_table (id, data) VALUES (%s, %s) ON DUPLICATE KEY UPDATE data = %s, updated_at = CURRENT_TIMESTAMP .. versionchanged:: 1.3 support for parameter-ordered UPDATE clause within @@ -649,7 +649,7 @@ table: ... ) >>> print(do_update_stmt) - {opensql}INSERT INTO my_table (id, data, author) VALUES (%s, %s, %s) + {printsql}INSERT INTO my_table (id, data, author) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE data = %s, author = VALUES(author) When rendered, the "inserted" namespace will produce the expression diff --git a/lib/sqlalchemy/dialects/postgresql/base.py b/lib/sqlalchemy/dialects/postgresql/base.py index f3e98caa0..d47a037c4 100644 --- a/lib/sqlalchemy/dialects/postgresql/base.py +++ b/lib/sqlalchemy/dialects/postgresql/base.py @@ -539,7 +539,7 @@ and :meth:`~.postgresql.Insert.on_conflict_do_nothing`: ... index_elements=['id'] ... ) >>> print(do_nothing_stmt) - {opensql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) + {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) ON CONFLICT (id) DO NOTHING {stop} @@ -548,7 +548,7 @@ and :meth:`~.postgresql.Insert.on_conflict_do_nothing`: ... set_=dict(data='updated value') ... ) >>> print(do_update_stmt) - {opensql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) + {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) ON CONFLICT ON CONSTRAINT pk_my_table DO UPDATE SET data = %(param_1)s .. versionadded:: 1.1 @@ -577,7 +577,7 @@ named constraint or by column inference: ... set_=dict(data='updated value') ... ) >>> print(do_update_stmt) - {opensql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) + {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) ON CONFLICT (id) DO UPDATE SET data = %(param_1)s {stop} @@ -586,7 +586,7 @@ named constraint or by column inference: ... set_=dict(data='updated value') ... ) >>> print(do_update_stmt) - {opensql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) + {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) ON CONFLICT (id) DO UPDATE SET data = %(param_1)s * When using :paramref:`_postgresql.Insert.on_conflict_do_update.index_elements` to @@ -602,7 +602,7 @@ named constraint or by column inference: ... set_=dict(data=stmt.excluded.data) ... ) >>> print(stmt) - {opensql}INSERT INTO my_table (data, user_email) + {printsql}INSERT INTO my_table (data, user_email) VALUES (%(data)s, %(user_email)s) ON CONFLICT (user_email) WHERE user_email LIKE %(user_email_1)s DO UPDATE SET data = excluded.data @@ -617,7 +617,7 @@ named constraint or by column inference: ... set_=dict(data='updated value') ... ) >>> print(do_update_stmt) - {opensql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) + {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) ON CONFLICT ON CONSTRAINT my_table_idx_1 DO UPDATE SET data = %(param_1)s {stop} @@ -626,7 +626,7 @@ named constraint or by column inference: ... set_=dict(data='updated value') ... ) >>> print(do_update_stmt) - {opensql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) + {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) ON CONFLICT ON CONSTRAINT my_table_pk DO UPDATE SET data = %(param_1)s {stop} @@ -649,7 +649,7 @@ named constraint or by column inference: ... set_=dict(data='updated value') ... ) >>> print(do_update_stmt) - {opensql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) + {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) ON CONFLICT (id) DO UPDATE SET data = %(param_1)s The SET Clause @@ -670,7 +670,7 @@ for UPDATE: ... set_=dict(data='updated value') ... ) >>> print(do_update_stmt) - {opensql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) + {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) ON CONFLICT (id) DO UPDATE SET data = %(param_1)s .. warning:: @@ -705,7 +705,7 @@ table: ... set_=dict(data='updated value', author=stmt.excluded.author) ... ) >>> print(do_update_stmt) - {opensql}INSERT INTO my_table (id, data, author) + {printsql}INSERT INTO my_table (id, data, author) VALUES (%(id)s, %(data)s, %(author)s) ON CONFLICT (id) DO UPDATE SET data = %(param_1)s, author = excluded.author @@ -729,7 +729,7 @@ parameter, which will limit those rows which receive an UPDATE: ... where=(my_table.c.status == 2) ... ) >>> print(on_update_stmt) - {opensql}INSERT INTO my_table (id, data, author) + {printsql}INSERT INTO my_table (id, data, author) VALUES (%(id)s, %(data)s, %(author)s) ON CONFLICT (id) DO UPDATE SET data = %(param_1)s, author = excluded.author WHERE my_table.status = %(status_1)s @@ -747,7 +747,7 @@ this is illustrated using the >>> stmt = insert(my_table).values(id='some_id', data='inserted value') >>> stmt = stmt.on_conflict_do_nothing(index_elements=['id']) >>> print(stmt) - {opensql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) + {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) ON CONFLICT (id) DO NOTHING If ``DO NOTHING`` is used without specifying any columns or constraint, @@ -759,7 +759,7 @@ constraint violation which occurs: >>> stmt = insert(my_table).values(id='some_id', data='inserted value') >>> stmt = stmt.on_conflict_do_nothing() >>> print(stmt) - {opensql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) + {printsql}INSERT INTO my_table (id, data) VALUES (%(id)s, %(data)s) ON CONFLICT DO NOTHING .. _postgresql_match: @@ -1249,7 +1249,7 @@ Examples from PostgreSQL's reference documentation follow below: >>> from sqlalchemy import select, func >>> stmt = select(func.json_each('{"a":"foo", "b":"bar"}').table_valued("key", "value")) >>> print(stmt) - SELECT anon_1.key, anon_1.value + {printsql}SELECT anon_1.key, anon_1.value FROM json_each(:json_each_1) AS anon_1 * ``json_populate_record()``:: @@ -1262,7 +1262,7 @@ Examples from PostgreSQL's reference documentation follow below: ... ).table_valued("a", "b", name="x") ... ) >>> print(stmt) - SELECT x.a, x.b + {printsql}SELECT x.a, x.b FROM json_populate_record(null::myrowtype, :json_populate_record_1) AS x * ``json_to_record()`` - this form uses a PostgreSQL specific form of derived @@ -1279,7 +1279,7 @@ Examples from PostgreSQL's reference documentation follow below: ... ).render_derived(name="x", with_types=True) ... ) >>> print(stmt) - SELECT x.a, x.b, x.d + {printsql}SELECT x.a, x.b, x.d FROM json_to_record(:json_to_record_1) AS x(a INTEGER, b TEXT, d TEXT) * ``WITH ORDINALITY`` - part of the SQL standard, ``WITH ORDINALITY`` adds an @@ -1296,7 +1296,7 @@ Examples from PostgreSQL's reference documentation follow below: ... render_derived() ... ) >>> print(stmt) - SELECT anon_1.value, anon_1.ordinality + {printsql}SELECT anon_1.value, anon_1.ordinality FROM generate_series(:generate_series_1, :generate_series_2, :generate_series_3) WITH ORDINALITY AS anon_1(value, ordinality) @@ -1333,7 +1333,7 @@ scalar value. PostgreSQL functions such as ``json_array_elements()``, >>> from sqlalchemy import select, func >>> stmt = select(func.unnest(array([1, 2])).column_valued()) >>> print(stmt) - SELECT anon_1 + {printsql}SELECT anon_1 FROM unnest(ARRAY[%(param_1)s, %(param_2)s]) AS anon_1 The function can of course be used against an existing table-bound column @@ -1344,7 +1344,7 @@ scalar value. PostgreSQL functions such as ``json_array_elements()``, >>> t = table("t", column('value', ARRAY(Integer))) >>> stmt = select(func.unnest(t.c.value).column_valued("unnested_value")) >>> print(stmt) - SELECT unnested_value + {printsql}SELECT unnested_value FROM unnest(t.value) AS unnested_value .. seealso:: @@ -1395,7 +1395,7 @@ itself:: >>> a = table( "a", column("id"), column("x"), column("y")) >>> stmt = select(func.row_to_json(a.table_valued())) >>> print(stmt) - SELECT row_to_json(a) AS row_to_json_1 + {printsql}SELECT row_to_json(a) AS row_to_json_1 FROM a .. versionadded:: 1.4.0b2 diff --git a/lib/sqlalchemy/dialects/sqlite/base.py b/lib/sqlalchemy/dialects/sqlite/base.py index c2c08b312..e46443a74 100644 --- a/lib/sqlalchemy/dialects/sqlite/base.py +++ b/lib/sqlalchemy/dialects/sqlite/base.py @@ -492,7 +492,7 @@ and :meth:`_sqlite.Insert.on_conflict_do_nothing`: ... ) >>> print(do_update_stmt) - {opensql}INSERT INTO my_table (id, data) VALUES (?, ?) + {printsql}INSERT INTO my_table (id, data) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET data = ?{stop} >>> do_nothing_stmt = insert_stmt.on_conflict_do_nothing( @@ -500,7 +500,7 @@ and :meth:`_sqlite.Insert.on_conflict_do_nothing`: ... ) >>> print(do_nothing_stmt) - {opensql}INSERT INTO my_table (id, data) VALUES (?, ?) + {printsql}INSERT INTO my_table (id, data) VALUES (?, ?) ON CONFLICT (id) DO NOTHING .. versionadded:: 1.4 @@ -537,11 +537,10 @@ Both methods supply the "target" of the conflict using column inference: ... ) >>> print(do_update_stmt) - {opensql}INSERT INTO my_table (data, user_email) VALUES (?, ?) + {printsql}INSERT INTO my_table (data, user_email) VALUES (?, ?) ON CONFLICT (user_email) WHERE user_email LIKE '%@gmail.com' DO UPDATE SET data = excluded.data - >>> The SET Clause ^^^^^^^^^^^^^^^ @@ -563,8 +562,7 @@ for UPDATE: ... ) >>> print(do_update_stmt) - - {opensql}INSERT INTO my_table (id, data) VALUES (?, ?) + {printsql}INSERT INTO my_table (id, data) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET data = ? .. warning:: @@ -599,7 +597,7 @@ would have been inserted had the constraint not failed: ... ) >>> print(do_update_stmt) - {opensql}INSERT INTO my_table (id, data, author) VALUES (?, ?, ?) + {printsql}INSERT INTO my_table (id, data, author) VALUES (?, ?, ?) ON CONFLICT (id) DO UPDATE SET data = ?, author = excluded.author Additional WHERE Criteria @@ -623,7 +621,7 @@ parameter, which will limit those rows which receive an UPDATE: ... where=(my_table.c.status == 2) ... ) >>> print(on_update_stmt) - {opensql}INSERT INTO my_table (id, data, author) VALUES (?, ?, ?) + {printsql}INSERT INTO my_table (id, data, author) VALUES (?, ?, ?) ON CONFLICT (id) DO UPDATE SET data = ?, author = excluded.author WHERE my_table.status = ? @@ -640,7 +638,7 @@ using the :meth:`_sqlite.Insert.on_conflict_do_nothing` method: >>> stmt = insert(my_table).values(id='some_id', data='inserted value') >>> stmt = stmt.on_conflict_do_nothing(index_elements=['id']) >>> print(stmt) - {opensql}INSERT INTO my_table (id, data) VALUES (?, ?) ON CONFLICT (id) DO NOTHING + {printsql}INSERT INTO my_table (id, data) VALUES (?, ?) ON CONFLICT (id) DO NOTHING If ``DO NOTHING`` is used without specifying any columns or constraint, @@ -652,7 +650,7 @@ occurs: >>> stmt = insert(my_table).values(id='some_id', data='inserted value') >>> stmt = stmt.on_conflict_do_nothing() >>> print(stmt) - {opensql}INSERT INTO my_table (id, data) VALUES (?, ?) ON CONFLICT DO NOTHING + {printsql}INSERT INTO my_table (id, data) VALUES (?, ?) ON CONFLICT DO NOTHING .. _sqlite_type_reflection: diff --git a/lib/sqlalchemy/ext/hybrid.py b/lib/sqlalchemy/ext/hybrid.py index f27e721c2..baedc42c4 100644 --- a/lib/sqlalchemy/ext/hybrid.py +++ b/lib/sqlalchemy/ext/hybrid.py @@ -71,7 +71,7 @@ returns a new SQL expression:: interval."end" - interval.start >>> print(Session().query(Interval).filter(Interval.length > 10)) - SELECT interval.id AS interval_id, interval.start AS interval_start, + {printsql}SELECT interval.id AS interval_id, interval.start AS interval_start, interval."end" AS interval_end FROM interval WHERE interval."end" - interval.start > :param_1 @@ -81,7 +81,7 @@ generally use ``getattr()`` to locate attributes, so can also be used with hybrid attributes:: >>> print(Session().query(Interval).filter_by(length=5)) - SELECT interval.id AS interval_id, interval.start AS interval_start, + {printsql}SELECT interval.id AS interval_id, interval.start AS interval_start, interval."end" AS interval_end FROM interval WHERE interval."end" - interval.start = :param_1 @@ -104,14 +104,14 @@ SQL expression-level boolean behavior:: False >>> print(Session().query(Interval).filter(Interval.contains(15))) - SELECT interval.id AS interval_id, interval.start AS interval_start, + {printsql}SELECT interval.id AS interval_id, interval.start AS interval_start, interval."end" AS interval_end FROM interval WHERE interval.start <= :start_1 AND interval."end" > :end_1 >>> ia = aliased(Interval) >>> print(Session().query(Interval, ia).filter(Interval.intersects(ia))) - SELECT interval.id AS interval_id, interval.start AS interval_start, + {printsql}SELECT interval.id AS interval_id, interval.start AS interval_start, interval."end" AS interval_end, interval_1.id AS interval_1_id, interval_1.start AS interval_1_start, interval_1."end" AS interval_1_end FROM interval, interval AS interval_1 @@ -370,7 +370,7 @@ would use an outer join:: >>> from sqlalchemy import or_ >>> print (Session().query(User, User.balance).outerjoin(User.accounts). ... filter(or_(User.balance < 5000, User.balance == None))) - SELECT "user".id AS user_id, "user".name AS user_name, + {printsql}SELECT "user".id AS user_id, "user".name AS user_name, account.balance AS account_balance FROM "user" LEFT OUTER JOIN account ON "user".id = account.user_id WHERE account.balance < :balance_1 OR account.balance IS NULL @@ -474,7 +474,7 @@ Above, SQL expressions against ``word_insensitive`` will apply the ``LOWER()`` SQL function to both sides:: >>> print(Session().query(SearchWord).filter_by(word_insensitive="Trucks")) - SELECT searchword.id AS searchword_id, searchword.word AS searchword_word + {printsql}SELECT searchword.id AS searchword_id, searchword.word AS searchword_word FROM searchword WHERE lower(searchword.word) = lower(:lower_1) @@ -628,7 +628,7 @@ SQL expression versus SQL expression:: ... filter( ... sw1.word_insensitive > sw2.word_insensitive ... )) - SELECT lower(searchword_1.word) AS lower_1, + {printsql}SELECT lower(searchword_1.word) AS lower_1, lower(searchword_2.word) AS lower_2 FROM searchword AS searchword_1, searchword AS searchword_2 WHERE lower(searchword_1.word) > lower(searchword_2.word) diff --git a/lib/sqlalchemy/sql/_elements_constructors.py b/lib/sqlalchemy/sql/_elements_constructors.py index 1d8818a1f..6e5a7bc5e 100644 --- a/lib/sqlalchemy/sql/_elements_constructors.py +++ b/lib/sqlalchemy/sql/_elements_constructors.py @@ -1066,23 +1066,23 @@ def false() -> False_: >>> from sqlalchemy import false >>> print(select(t.c.x).where(false())) - SELECT x FROM t WHERE false + {printsql}SELECT x FROM t WHERE false A backend which does not support true/false constants will render as an expression against 1 or 0:: >>> print(select(t.c.x).where(false())) - SELECT x FROM t WHERE 0 = 1 + {printsql}SELECT x FROM t WHERE 0 = 1 The :func:`.true` and :func:`.false` constants also feature "short circuit" operation within an :func:`.and_` or :func:`.or_` conjunction:: >>> print(select(t.c.x).where(or_(t.c.x > 5, true()))) - SELECT x FROM t WHERE true + {printsql}SELECT x FROM t WHERE true >>> print(select(t.c.x).where(and_(t.c.x > 5, false()))) - SELECT x FROM t WHERE false + {printsql}SELECT x FROM t WHERE false .. versionchanged:: 0.9 :func:`.true` and :func:`.false` feature better integrated behavior within conjunctions and on dialects @@ -1483,23 +1483,23 @@ def true() -> True_: >>> from sqlalchemy import true >>> print(select(t.c.x).where(true())) - SELECT x FROM t WHERE true + {printsql}SELECT x FROM t WHERE true A backend which does not support true/false constants will render as an expression against 1 or 0:: >>> print(select(t.c.x).where(true())) - SELECT x FROM t WHERE 1 = 1 + {printsql}SELECT x FROM t WHERE 1 = 1 The :func:`.true` and :func:`.false` constants also feature "short circuit" operation within an :func:`.and_` or :func:`.or_` conjunction:: >>> print(select(t.c.x).where(or_(t.c.x > 5, true()))) - SELECT x FROM t WHERE true + {printsql}SELECT x FROM t WHERE true >>> print(select(t.c.x).where(and_(t.c.x > 5, false()))) - SELECT x FROM t WHERE false + {printsql}SELECT x FROM t WHERE false .. versionchanged:: 0.9 :func:`.true` and :func:`.false` feature better integrated behavior within conjunctions and on dialects diff --git a/lib/sqlalchemy/sql/dml.py b/lib/sqlalchemy/sql/dml.py index 355a00c60..1ab7f2ceb 100644 --- a/lib/sqlalchemy/sql/dml.py +++ b/lib/sqlalchemy/sql/dml.py @@ -681,7 +681,7 @@ class UpdateBase( ... .returning(table.c.server_flag, table.c.updated_timestamp) ... ) >>> print(stmt) - UPDATE some_table SET status=:status + {printsql}UPDATE some_table SET status=:status WHERE some_table.data = :data_1 RETURNING some_table.server_flag, some_table.updated_timestamp @@ -702,7 +702,7 @@ class UpdateBase( ... (table.c.first_name + " " + table.c.last_name).label("fullname") ... ) >>> print(stmt) - INSERT INTO some_table (first_name, last_name) + {printsql}INSERT INTO some_table (first_name, last_name) VALUES (:first_name, :last_name) RETURNING some_table.first_name || :first_name_1 || some_table.last_name AS fullname diff --git a/lib/sqlalchemy/sql/functions.py b/lib/sqlalchemy/sql/functions.py index 446cbcd3c..902811037 100644 --- a/lib/sqlalchemy/sql/functions.py +++ b/lib/sqlalchemy/sql/functions.py @@ -194,7 +194,7 @@ class FunctionElement(Executable, ColumnElement[_T], FromClause, Generative): >>> from sqlalchemy import func, select >>> fn = func.jsonb_each("{'k', 'v'}").scalar_table_valued("key") >>> print(select(fn)) - SELECT (jsonb_each(:jsonb_each_1)).key + {printsql}SELECT (jsonb_each(:jsonb_each_1)).key .. versionadded:: 1.4.0b2 @@ -222,11 +222,11 @@ class FunctionElement(Executable, ColumnElement[_T], FromClause, Generative): ... ) >>> print(select(fn)) - SELECT anon_1.value, anon_1.start, anon_1.stop, anon_1.step + {printsql}SELECT anon_1.value, anon_1.start, anon_1.stop, anon_1.step FROM generate_series(:generate_series_1, :generate_series_2) AS anon_1 >>> print(select(fn.c.value, fn.c.stop).where(fn.c.value > 2)) - SELECT anon_1.value, anon_1.stop + {printsql}SELECT anon_1.value, anon_1.stop FROM generate_series(:generate_series_1, :generate_series_2) AS anon_1 WHERE anon_1.value > :value_1 @@ -235,7 +235,7 @@ class FunctionElement(Executable, ColumnElement[_T], FromClause, Generative): >>> fn = func.generate_series(4, 1, -1).table_valued("gen", with_ordinality="ordinality") >>> print(select(fn)) - SELECT anon_1.gen, anon_1.ordinality + {printsql}SELECT anon_1.gen, anon_1.ordinality FROM generate_series(:generate_series_1, :generate_series_2, :generate_series_3) WITH ORDINALITY AS anon_1 :param \*expr: A series of string column names that will be added to the @@ -301,7 +301,7 @@ class FunctionElement(Executable, ColumnElement[_T], FromClause, Generative): >>> from sqlalchemy import select, func >>> gs = func.generate_series(1, 5, -1).column_valued() >>> print(select(gs)) - SELECT anon_1 + {printsql}SELECT anon_1 FROM generate_series(:generate_series_1, :generate_series_2, :generate_series_3) AS anon_1 This is shorthand for:: @@ -341,7 +341,7 @@ class FunctionElement(Executable, ColumnElement[_T], FromClause, Generative): >>> from sqlalchemy import column, select, func >>> stmt = select(column('x'), column('y')).select_from(func.myfunction()) >>> print(stmt) - SELECT x, y FROM myfunction() + {printsql}SELECT x, y FROM myfunction() The above form is a legacy feature that is now superseded by the fully capable :meth:`_functions.FunctionElement.table_valued` @@ -588,7 +588,7 @@ class FunctionElement(Executable, ColumnElement[_T], FromClause, Generative): >>> from sqlalchemy import func, select, column >>> data_view = func.unnest([1, 2, 3]).alias("data_view") >>> print(select(data_view.column)) - SELECT data_view + {printsql}SELECT data_view FROM unnest(:unnest_1) AS data_view The :meth:`_functions.FunctionElement.column_valued` method provides @@ -596,7 +596,7 @@ class FunctionElement(Executable, ColumnElement[_T], FromClause, Generative): >>> data_view = func.unnest([1, 2, 3]).column_valued("data_view") >>> print(select(data_view)) - SELECT data_view + {printsql}SELECT data_view FROM unnest(:unnest_1) AS data_view .. versionadded:: 1.4.0b2 Added the ``.column`` accessor @@ -772,7 +772,7 @@ class _FunctionGenerator: column-oriented SQL element like any other, and is used in that way:: >>> print(select(func.count(table.c.id))) - SELECT count(sometable.id) FROM sometable + {printsql}SELECT count(sometable.id) FROM sometable Any name can be given to :data:`.func`. If the function name is unknown to SQLAlchemy, it will be rendered exactly as is. For common SQL functions @@ -780,13 +780,13 @@ class _FunctionGenerator: function* which will be compiled appropriately to the target database:: >>> print(func.current_timestamp()) - CURRENT_TIMESTAMP + {printsql}CURRENT_TIMESTAMP To call functions which are present in dot-separated packages, specify them in the same manner:: >>> print(func.stats.yield_curve(5, 10)) - stats.yield_curve(:yield_curve_1, :yield_curve_2) + {printsql}stats.yield_curve(:yield_curve_1, :yield_curve_2) SQLAlchemy can be made aware of the return type of functions to enable type-specific lexical and result-based behavior. For example, to ensure @@ -796,7 +796,7 @@ class _FunctionGenerator: >>> print(func.my_string(u'hi', type_=Unicode) + ' ' + ... func.my_string(u'there', type_=Unicode)) - my_string(:my_string_1) || :my_string_2 || my_string(:my_string_3) + {printsql}my_string(:my_string_1) || :my_string_2 || my_string(:my_string_3) The object returned by a :data:`.func` call is usually an instance of :class:`.Function`. @@ -834,7 +834,7 @@ class _FunctionGenerator: :class:`.Function` - """ + """ # noqa def __init__(self, **opts): self.__names = [] @@ -1250,14 +1250,14 @@ class concat(GenericFunction[str]): E.g.:: >>> print(select(func.concat('a', 'b'))) - SELECT concat(:concat_2, :concat_3) AS concat_1 + {printsql}SELECT concat(:concat_2, :concat_3) AS concat_1 String concatenation in SQLAlchemy is more commonly available using the Python ``+`` operator with string datatypes, which will render a backend-specific concatenation operator, such as :: >>> print(select(literal("a") + "b")) - SELECT :param_1 || :param_2 AS anon_1 + {printsql}SELECT :param_1 || :param_2 AS anon_1 """ diff --git a/lib/sqlalchemy/sql/selectable.py b/lib/sqlalchemy/sql/selectable.py index 898b524ad..1d283e83c 100644 --- a/lib/sqlalchemy/sql/selectable.py +++ b/lib/sqlalchemy/sql/selectable.py @@ -1032,7 +1032,7 @@ class NamedFromClause(FromClause): >>> a = table("a", column("id"), column("x"), column("y")) >>> stmt = select(func.row_to_json(a.table_valued())) >>> print(stmt) - SELECT row_to_json(a) AS row_to_json_1 + {printsql}SELECT row_to_json(a) AS row_to_json_1 FROM a .. versionadded:: 1.4.0b2 @@ -1061,7 +1061,7 @@ class SelectLabelStyle(Enum): >>> table1 = table("table1", column("columna"), column("columnb")) >>> table2 = table("table2", column("columna"), column("columnc")) >>> print(select(table1, table2).join(table2, true()).set_label_style(LABEL_STYLE_NONE)) - SELECT table1.columna, table1.columnb, table2.columna, table2.columnc + {printsql}SELECT table1.columna, table1.columnb, table2.columna, table2.columnc FROM table1 JOIN table2 ON true Used with the :meth:`_sql.Select.set_label_style` method. @@ -1084,7 +1084,7 @@ class SelectLabelStyle(Enum): >>> table1 = table("table1", column("columna"), column("columnb")) >>> table2 = table("table2", column("columna"), column("columnc")) >>> print(select(table1, table2).join(table2, true()).set_label_style(LABEL_STYLE_TABLENAME_PLUS_COL)) - SELECT table1.columna AS table1_columna, table1.columnb AS table1_columnb, table2.columna AS table2_columna, table2.columnc AS table2_columnc + {printsql}SELECT table1.columna AS table1_columna, table1.columnb AS table1_columnb, table2.columna AS table2_columna, table2.columnc AS table2_columnc FROM table1 JOIN table2 ON true Used with the :meth:`_sql.GenerativeSelect.set_label_style` method. @@ -1111,7 +1111,7 @@ class SelectLabelStyle(Enum): >>> table1 = table("table1", column("columna"), column("columnb")) >>> table2 = table("table2", column("columna"), column("columnc")) >>> print(select(table1, table2).join(table2, true()).set_label_style(LABEL_STYLE_DISAMBIGUATE_ONLY)) - SELECT table1.columna, table1.columnb, table2.columna AS columna_1, table2.columnc + {printsql}SELECT table1.columna, table1.columnb, table2.columna AS columna_1, table2.columnc FROM table1 JOIN table2 ON true Used with the :meth:`_sql.GenerativeSelect.set_label_style` method, @@ -1719,7 +1719,7 @@ class TableValuedAlias(LateralFromClause, Alias): >>> from sqlalchemy import select, func >>> fn = func.json_array_elements_text('["one", "two", "three"]').table_valued("value") >>> print(select(fn.c.value)) - SELECT anon_1.value + {printsql}SELECT anon_1.value FROM json_array_elements_text(:json_array_elements_text_1) AS anon_1 .. versionadded:: 1.4.0b2 @@ -1831,7 +1831,7 @@ class TableValuedAlias(LateralFromClause, Alias): table_valued("x", with_ordinality="o").render_derived() ... ) ... ) - SELECT anon_1.x, anon_1.o + {printsql}SELECT anon_1.x, anon_1.o FROM unnest(ARRAY[%(param_1)s, %(param_2)s, %(param_3)s]) WITH ORDINALITY AS anon_1(x, o) The ``with_types`` keyword will render column types inline within @@ -1847,7 +1847,7 @@ class TableValuedAlias(LateralFromClause, Alias): ... .render_derived(with_types=True) ... ) ... ) - SELECT anon_1.a, anon_1.b FROM json_to_recordset(:json_to_recordset_1) + {printsql}SELECT anon_1.a, anon_1.b FROM json_to_recordset(:json_to_recordset_1) AS anon_1(a INTEGER, b VARCHAR) :param name: optional string name that will be applied to the alias diff --git a/lib/sqlalchemy/sql/sqltypes.py b/lib/sqlalchemy/sql/sqltypes.py index bcdbcc804..bcbc7004c 100644 --- a/lib/sqlalchemy/sql/sqltypes.py +++ b/lib/sqlalchemy/sql/sqltypes.py @@ -206,7 +206,7 @@ class String(Concatenable, TypeEngine[str]): >>> from sqlalchemy import cast, select, String >>> print(select(cast('some string', String(collation='utf8')))) - SELECT CAST(:param_1 AS VARCHAR COLLATE utf8) AS anon_1 + {printsql}SELECT CAST(:param_1 AS VARCHAR COLLATE utf8) AS anon_1 .. note:: |
