Wolodja Wentland wrote:
> On Tue, Oct 27, 2009 at 16:22 -0400, Michael Bayer wrote:
>> Wolodja Wentland wrote:
>> >
>> > def create(self):
>> >     """Create this database"""
>> >     # set isolation level to AUTOCOMMIT
>> >     # postgres can't CREATE databases within a transaction
>> >     self._admin_engine.connect().connection.connection.set_isolation_level(
>> >         ISOLATION_LEVEL_AUTOCOMMIT)
>> >
>> >     self.admin_session.execute('CREATE DATABASE %s'%(self.name))
>
>> there's nothing about the above code that guarantees the connection on
>> which you called set_isolation_level() is the one used by your
>> session.execute().   I think you mean to call execute("CREATE DATABASE")
>> on the connection returned by self._admin_engine.connect().
>
> You are right! I changed the code to this:
>
> --- snip ---
> def create(self):
>     """Create this database"""
>     # set isolation level to AUTOCOMMIT
>     # postgres can't CREATE databases within a transaction
>     conn = self._admin_engine.connect()
>     conn.connection.connection.set_isolation_level(
>         ISOLATION_LEVEL_AUTOCOMMIT)
>
>     conn.execute('CREATE DATABASE %s'%(self.name))
>
>     conn.connection.connection.set_isolation_level(
>         ISOLATION_LEVEL_READ_COMMITTED)
> --- snip ---
>
> and it works like a charm.
>
> But i still have some little questions...
>
> * Is there an even better way to do this? ;-)

create_engine() for PG supports an "isolation_level" parameter.  But it
only does the four levels PG provides, it doesn't yet have a hook for
Psycopg2's "autocommit" mode.

>
> * Is it necessary to set the isolation level to the value it had
>   before I set it to ISOLATION_LEVEL_AUTOCOMMIT to make sure that no
>   connection uses ISOLATION_LEVEL_AUTOCOMMIT in the future without
>   explicitly setting that?

the way you have it, yes.  Alternatively, you can call detach() on the
connection you returned and it will be de-associated from the connection
pool.  Otherwise I would absolutely use try/finally above so that the
isolation level is returned to normal if the CREATE DATABASE fails.

>
> * Why the .connection.connection ? I remember that I had to write just
>   one .connection in the past.

it should only need to be conn.connection.   That returns a wrapper that
will pass all method calls down to the psycopg2 connection.   would be
interested to know the error otherwise.


>
> And one more word... This is the fastest mailing list I have ever used.
> Thank you so much for reacting so fast on this ML, thank you very much
> for SA and thanks for the solution to my problem!

youre welcome


>
> have a great afternoon
>
>     Wolodja Wentland
>


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

Reply via email to