Thanks for the help!

I got around the problem by executing:
>>> c.execute('end;CREATE DATABASE test_db')

However, this seems a bit ugly. Is there a way to obtain a non-
transactional connection from an engine in 0.3.10? If not, is it
possible in 0.4?

Thanks,
Travis

On Aug 30, 6:40 pm, "Mike Orr" <[EMAIL PROTECTED]> wrote:
> On 8/30/07, Travis Kriplean <[EMAIL PROTECTED]> wrote:
>
>
>
> > I'd like to use SQLAlchemy to connect to a db server, create a
> > database, and then start using it. However, it appears that the
> > SQLAlchemy api assumes the existence of a database to connect to. I'm
> > able to connect to the server without a database specified:
>
> > >>> con = 'postgres://postgres:[EMAIL PROTECTED]'
> > >>> m = MetaData(bind=con)
> > >>> m.get_engine()
> > <sqlalchemy.engine.base.Engine object at 0x00E6B470>
>
> > However, when I try to execute a query to create the database, it
> > fails because CREATE DATABASE "cannot run inside a transaction block":
>
> > >>> c = m.get_engine().connect()
> > >>> c.execute('CREATE DATABASE test_db')
> > Traceback (most recent call last):
> >   File "<stdin>", line 1, in <module>
> >   File "c:\python25\lib\site-packages\sqlalchemy-0.3.10-py2.5.egg
> > \sqlalchemy\eng
> > ine\base.py", line 517, in execute
> >     return Connection.executors[c](self, object, *multiparams,
> > **params)
> >   File "c:\python25\lib\site-packages\sqlalchemy-0.3.10-py2.5.egg
> > \sqlalchemy\eng
> > ine\base.py", line 532, in execute_text
> >     self._execute_raw(context)
> >   File "c:\python25\lib\site-packages\sqlalchemy-0.3.10-py2.5.egg
> > \sqlalchemy\eng
> > ine\base.py", line 581, in _execute_raw
> >     self._execute(context)
> >   File "c:\python25\lib\site-packages\sqlalchemy-0.3.10-py2.5.egg
> > \sqlalchemy\eng
> > ine\base.py", line 599, in _execute
> >     raise exceptions.SQLError(context.statement, context.parameters,
> > e)
> > sqlalchemy.exceptions.SQLError: (ProgrammingError) CREATE DATABASE
> > cannot run in
> > side a transaction block
> >  'CREATE DATABASE test_db' {}
>
> That must be a Postgres-specific problem because it works with MySQL.
>
> $ python
> Python 2.5.1 (r251:54863, May  2 2007, 16:56:35)
> [GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2
> Type "help", "copyright", "credits" or "license" for more information.>>> 
> import sqlalchemy as sa
> >>> engine = sa.create_engine("mysql://root:[EMAIL PROTECTED]")
> >>> e = engine.connect().execute
> >>> e("create database test2")
>
> <sqlalchemy.engine.base.ResultProxy object at 0x83811ac>>>> e("show 
> databases").fetchall()
>
> [('information_schema',), ('mysql',), ('rlink',), ('shields',), 
> ('test2',)]>>> e("show tables").fetchall()
>
> Traceback (most recent call last):
> ...
>     raise exceptions.SQLError(context.statement, context.parameters, e)
> sqlalchemy.exceptions.OperationalError: (OperationalError) (1046, 'No
> database selected') 'show tables' ()>>> e("use test2")
>
> <sqlalchemy.engine.base.ResultProxy object at 0x846a36c>>>> e("show 
> tables").fetchall()
> []
> >>> e("drop database test2")
>
> <sqlalchemy.engine.base.ResultProxy object at 0x838124c>>>> e("show 
> databases").fetchall()
>
> [('information_schema',), ('mysql',), ('rlink',), ('shields',)]
>
> Obviously it's perilous to switch databases in an existing engine,
> especially if it's bound to a session or metadata.  MySQL
> automatically commits the last transaction before running a
> non-transactional command (which basically means any schema-changing
> operation).  This may confuse the hell out of your session if you
> don't commit + clear first.  I don't know if PostgreSQL does the same.
>
> --
> Mike Orr <[EMAIL PROTECTED]>


--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to