From aa033afeeedd4d41493819312d652041017abf72 Mon Sep 17 00:00:00 2001 From: Jason Kirtland Date: Fri, 7 Mar 2008 16:56:37 +0000 Subject: Added support for vendor-extended INSERT syntax like INSERT DELAYED INTO --- lib/sqlalchemy/sql/compiler.py | 5 ++++- lib/sqlalchemy/sql/expression.py | 22 +++++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) (limited to 'lib/sqlalchemy/sql') diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index 8a2a5f2dd..bb9cc7597 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -626,7 +626,10 @@ class DefaultCompiler(engine.Compiled): colparams = self._get_colparams(insert_stmt) preparer = self.preparer - return ("INSERT INTO %s (%s) VALUES (%s)" % + insert = ' '.join(["INSERT"] + + [self.process(x) for x in insert_stmt._prefixes]) + + return (insert + " INTO %s (%s) VALUES (%s)" % (preparer.format_table(insert_stmt.table), ', '.join([preparer.quote(c[0], c[0].name) for c in colparams]), diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py index 8e2a13e7c..316cbd7c1 100644 --- a/lib/sqlalchemy/sql/expression.py +++ b/lib/sqlalchemy/sql/expression.py @@ -274,6 +274,10 @@ def insert(table, values=None, inline=False, **kwargs): column specifications will be generated from the full list of table columns. + prefixes + A list of modifier keywords to be inserted between INSERT and INTO, + see ``Insert.prefix_with``. + inline if True, SQL defaults will be compiled 'inline' into the statement and not pre-executed. @@ -3475,11 +3479,16 @@ class _UpdateBase(ClauseElement): bind = property(bind, _set_bind) class Insert(_UpdateBase): - def __init__(self, table, values=None, inline=False, bind=None, **kwargs): + def __init__(self, table, values=None, inline=False, bind=None, prefixes=None, **kwargs): self._bind = bind self.table = table self.select = None self.inline=inline + if prefixes: + self._prefixes = [_literal_as_text(p) for p in prefixes] + else: + self._prefixes = [] + self.parameters = self._process_colparams(values) self.kwargs = kwargs @@ -3504,6 +3513,17 @@ class Insert(_UpdateBase): u.parameters.update(u._process_colparams(v)) return u + def prefix_with(self, clause): + """Add a word or expression between INSERT and INTO. Generative. + + If multiple prefixes are supplied, they will be separated with + spaces. + """ + gen = self._clone() + clause = _literal_as_text(clause) + gen._prefixes = self._prefixes + [clause] + return gen + class Update(_UpdateBase): def __init__(self, table, whereclause, values=None, inline=False, bind=None, **kwargs): self._bind = bind -- cgit v1.2.1