I got:

  File "C:\Python26\lib\site-packages\sqlalchemy-0.7.2-py2.6-win32.egg
\sqlalchemy\engine\base.py", line 2285, in execute
    return connection.execute(statement, *multiparams, **params)
  File "C:\Python26\lib\site-packages\sqlalchemy-0.7.2-py2.6-win32.egg
\sqlalchemy\engine\base.py", line 1399, in execute
    params)
  File "C:\Python26\lib\site-packages\sqlalchemy-0.7.2-py2.6-win32.egg
\sqlalchemy\engine\base.py", line 1532, in _execute_clauseelement
    compiled_sql, distilled_params
  File "C:\Python26\lib\site-packages\sqlalchemy-0.7.2-py2.6-win32.egg
\sqlalchemy\engine\base.py", line 1599, in _execute_context
    None, None)
  File "C:\Python26\lib\site-packages\sqlalchemy-0.7.2-py2.6-win32.egg
\sqlalchemy\engine\base.py", line 1595, in _execute_context
    context = constructor(dialect, self, conn, *args)
  File "C:\Python26\lib\site-packages\sqlalchemy-0.7.2-py2.6-win32.egg
\sqlalchemy\engine\default.py", line 433, in _init_compiled
    self.postfetch_cols = self.compiled.postfetch
StatementError: 'MSSQLCompiler' object has no attribute
'postfetch' (original cause: AttributeError: 'MSSQLCompiler' object
has no attribute 'postfetch') 'INSERT INTO...'

On 18 Ago, 19:08, Michael Bayer <mike...@zzzcomputing.com> wrote:
> On Aug 18, 2011, at 1:06 PM, Massi wrote:
>
>
>
>
>
>
>
>
>
> > I changed the code to (SA 0.7.2 with pyodbc2.1.9):
>
> > class InsertFromSelect(Executable, ClauseElement) :
> >    _execution_options =\
>
> > Executable._execution_options.union({'autocommit': True})
> >    def __init__(self, table, select) :
> >        self.table = table
> >        self.select = select
>
> > @compiler.compiles(InsertFromSelect, "mssql")
> > def visit_insert_from_select(element, compiler, **kw) :
> >    compiler.isinsert = True
> >    compiler._mssql_requires_identity_insert = True
> >    tab_name = compiler.process(element.table, asfrom=True)
> >    q = "INSERT INTO %s (%s) %s;" % (tab_name,
> >        ', '.join([compiler.process(c) for c in element.table.c]),
> >        compiler.process(element.select))
> >    return q
>
> > applied the patch and I got the following error:
>
> It's just checking if theres a RETURNING clause added, which your clause does 
> not yet support.  Add _returning = False to your construct for now.
>
>
>
>
>
>
>
>
>
> >  File "C:\Python26\lib\site-packages\sqlalchemy-0.7.2-py2.6-win32.egg
> > \sqlalchemy\engine\base.py", line 2285, in execute
> >    return connection.execute(statement, *multiparams, **params)
> >  File "C:\Python26\lib\site-packages\sqlalchemy-0.7.2-py2.6-win32.egg
> > \sqlalchemy\engine\base.py", line 1399, in execute
> >    params)
> >  File "C:\Python26\lib\site-packages\sqlalchemy-0.7.2-py2.6-win32.egg
> > \sqlalchemy\engine\base.py", line 1532, in _execute_clauseelement
> >    compiled_sql, distilled_params
> >  File "C:\Python26\lib\site-packages\sqlalchemy-0.7.2-py2.6-win32.egg
> > \sqlalchemy\engine\base.py", line 1599, in _execute_context
> >    None, None)
> >  File "C:\Python26\lib\site-packages\sqlalchemy-0.7.2-py2.6-win32.egg
> > \sqlalchemy\engine\base.py", line 1595, in _execute_context
> >    context = constructor(dialect, self, conn, *args)
> >  File "C:\Python26\lib\site-packages\sqlalchemy-0.7.2-py2.6-win32.egg
> > \sqlalchemy\engine\default.py", line 418, in _init_compiled
> >    self._is_explicit_returning = compiled.statement._returning
> >  StatementError: 'InsertFromSelect' object has no attribute
> > '_returning' (original cause: AttributeError: 'InsertFromSelect'
> > object has no    attribute '_returning') 'INSERT INTO...'
>
> > On 18 Ago, 18:34, Michael Bayer <mike...@zzzcomputing.com> wrote:
> >> On Aug 18, 2011, at 12:24 PM, Massi wrote:
>
> >>> Hi everyone, I'm trying to implement an InsertFromSelect workaround to
> >>> handle the identity insert issue of SQL server. This is more or less
> >>> what I'm doing:
>
> >>> class InsertFromSelect(Executable, ClauseElement) :
> >>>    def __init__(self, table, select) :
> >>>        self.table = table
> >>>        self.select = select
>
> >>> @compiler.compiles(InsertFromSelect, "mssql")
> >>> def visit_insert_from_select(element, compiler, **kw) :
> >>>    tab_name = compiler.process(element.table, asfrom=True)
> >>>    q = "SET IDENTITY_INSERT %s ON;" %(tab_name)
> >>>    q += "INSERT INTO %s (%s) %s;" % (tab_name,
> >>>        ', '.join([compiler.process(c) for c in element.table.c]),
> >>>        compiler.process(element.select))
> >>>    q += "SET IDENTITY_INSERT %s OFF;" %(tab_name)
> >>>    return q
>
> >> it would be better to use the built in IDENTITY_INSERT facilities of the 
> >> MSSQL dialect itself.      
>
> >> Set the "isinsert" flag on your compiled object, and also set a new flag I 
> >> can add called "_mssql_requires_identity_insert":
>
> >> @compiler.compiles(InsertFromSelect, "mssql")
> >> def visit_insert_from_select(element, compiler, **kw) :
> >>     compiler.isinsert = True
> >>     compiler._mssql_requires_identity_insert = True
>
> >> patch for testing:
>
> >> diff -r 44e239751af8 lib/sqlalchemy/dialects/mssql/base.py
> >> --- a/lib/sqlalchemy/dialects/mssql/base.py     Wed Aug 17 14:55:21 2011 
> >> -0400
> >> +++ b/lib/sqlalchemy/dialects/mssql/base.py     Thu Aug 18 12:32:22 2011 
> >> -0400
> >> @@ -655,7 +655,9 @@
> >>              seq_column = tbl._autoincrement_column
> >>              insert_has_sequence = seq_column is not None
>
> >> -            if insert_has_sequence:
> >> +            if getattr(self.compiled._mssql_requires_identity_insert, 
> >> False):
> >> +                self._enable_identity_insert = True
> >> +            elif insert_has_sequence:
> >>                  self._enable_identity_insert = \
> >>                          seq_column.key in self.compiled_parameters[0]
> >>              else:
>
> >> if this works for you I can commit it with a short test and it will be in 
> >> 0.7.3.
>
> >>> insert_from_select = InsertFromSelect(new_table, old_table))
> >>> engine.execute(insert_from_select)
>
> >> easier issue here, your construct also needs "autocommit" enabled if you 
> >> are going to use connectionless execution:
>
> >> class InsertFromSelect(...):
> >>       _execution_options = \
> >>            Executable._execution_options.union({'autocommit': True})
>
> >> or better yet just subclass UpdateBase instead of (Executable, 
> >> ClauseElement).
>
> >> will add a doc
>
> > --
> > You received this message because you are subscribed to the Google Groups 
> > "sqlalchemy" group.
> > To post to this group, send email to sqlalchemy@googlegroups.com.
> > To unsubscribe from this group, send email to 
> > sqlalchemy+unsubscr...@googlegroups.com.
> > For more options, visit this group 
> > athttp://groups.google.com/group/sqlalchemy?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to