Ian Bicking wrote:
What do people think about standardizing on a URI syntax for connecting to databases? It makes it much easier to configure databases from my experience, and helps unify the different signatures of connect(). In SQLObject we've been using:

module_name://user:[EMAIL PROTECTED]:port/database_name?other_parameters

except database names instead of module names, like firebird: instead of kinterbasdb:, and pgsql: instead of psycopg:, but maybe that could change. Or modules could provide aliases... though that would make it harder, since it's harder to detect aliases. Maybe the URI could be translated to:

mod = __import__(uri.split(':')[0])
conn = mod.uri_connection(uri)

Some databases are different, like sqlite:/path_to_db_file, but they pretty much all fit into the pattern. SQLite in-memory databases are weird, since you connect to ':memory:', and there's all the Windows-path-as-URI issues, but this is exactly the sort of thing where a small spec could give consistency.

Also parameters end up all being strings, so you have to coerce them if you want booleans or some other value -- usually this is fairly easy to figure out, but it should be moved to the URI translation.

It also occurs to me that it would be nice to parse the connection string without actually making a connection -- i.e., produce (factory, args, kwargs), like (psycopg.connect, ('dsn=...',), {}).


My particular desire here is I want a database backend for a web sessions, and that database has to be configurable, and a URI is the nicest way to configure it. But I want to write it to the DB-API, not SQLObject, so pushing that standard up the stack would be nice. I could factor this out of SQLObject right now, but ultimately it would be better if database drivers included the parsing code in their own packages.


Thoughts?

This doesn't strike me as very Pythonic. The DB API spec specifies a set of keyword parameters that cover most usage scenarios already:

        As a guideline the connection constructor parameters should be
        implemented as keyword parameters for more intuitive use and
        follow this order of parameters:

        dsn         Data source name as string
        user        User name as string (optional)
        password    Password as string (optional)
        host        Hostname (optional)
        database    Database name (optional)

        E.g. a connect could look like this:

        connect(dsn='myhost:MYDB',user='guido',password='234$')

Your syntax seems to be more geared torwards an abstract
interface to databases, which is - as you say - one level
above the DB API spec.

It should be rather simple to write a factory function which
takes your syntax and then imports the right module, translates
the parameters and connects to the database.

--
Marc-Andre Lemburg
eGenix.com

Professional Python Services directly from the Source  (#1, Mar 30 2005)
>>> Python/Zope Consulting and Support ...        http://www.egenix.com/
>>> mxODBC.Zope.Database.Adapter ...             http://zope.egenix.com/
>>> mxODBC, mxDateTime, mxTextTools ...        http://python.egenix.com/
________________________________________________________________________

::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,FreeBSD for free ! ::::
_______________________________________________
DB-SIG maillist  -  [email protected]
http://mail.python.org/mailman/listinfo/db-sig

Reply via email to