[sqlalchemy] Generic ODBC connection (4D anyone?)

2010-02-19 Thread James
Anyone heard of 4D? Probably not, but I would love to work with
SQLAlchemy and this database.

How hard is it to write a new dialect?

Anyone had luck using generic odbc (ie not mysql moduled to pyodbc) to
connect to various unsupported databases?

I've tried a couple connection strings, the biggest problem is 4D
doesn't have a database name.

# connect to the actual database
from sqlalchemy import create_engine
#using DSN
engine = create_engine('mysql+pyodbc://4D_v11_Dev/DEFAULT_SCHEMA')
#using URL
engine = create_engine('mysql://user:p...@127.0.0.1', module='pyodbc')
#another dialect with DSN = ERROR: AttributeError: 'str' object has
no attribute 'paramstyle'
engine = create_engine('mssql://4D_v11_Dev', module='pyodbc')
# yet another try
engine = create_engine('mysql+pyodbc://4D_v11_Dev')
# show me output
engine.echo = True

None of those work, I have some stack traces, but the gist is this:
# when used without a database name
sqlalchemy.exc.DBAPIError: (Error) ('08004', '[08004] Server rejected
the connection:\nFailed to parse statement.\r (1301)
(SQLExecDirectW)') 'SELECT DATABASE()' ()

# when I try to specify a name
sqlalchemy.exc.DBAPIError: (Error) ('0', '[0] [iODBC][Driver
Manager]dlopen({MySQL}, 6): image not found (0) (SQLDriverConnectW)')
None None

But connection directly via pyodbc does work
import pyodbc
cnxn = pyodbc.connect(DSN=4D_v11_Dev;UID=user;PWD=pass)
cursor = cnxn.cursor()
cursor.execute('select * from ODBCTest')
a=cursor.fetchall()
print 'pyodbc',a

-- 
You received this message because you are subscribed to the Google Groups 
sqlalchemy group.
To post to this group, send email to sqlalch...@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.



Re: [sqlalchemy] Generic ODBC connection (4D anyone?)

2010-02-19 Thread Michael Bayer

On Feb 19, 2010, at 2:17 PM, James wrote:

 Anyone heard of 4D? Probably not, but I would love to work with
 SQLAlchemy and this database.
 
 How hard is it to write a new dialect?

by all reports, including some new ones gained today at pycon, it is extremely 
easy.  provided your database is relational.

 
 Anyone had luck using generic odbc (ie not mysql moduled to pyodbc) to
 connect to various unsupported databases?

step 1, get pyodbc to connect to your database.   that may be easy or may 
involve contacting the pyodbc author for fixes.

step 2, create a .py file that imports the PyODBC connector as a mixin to 
class YourDialect(), the same way as any other dialect, and make any changes 
to the create_connect_args method as necessary in your subclass.

step 3, establish a setup.py for your application which establishes your 
library as a setuptools entrypoint for sqlalchemy.dialects.   the name you 
give it is what you'd call upon in create_engine().  I'd suggest a name like 
4d+pyodbc.



 
 I've tried a couple connection strings, the biggest problem is 4D
 doesn't have a database name.
 
 # connect to the actual database
 from sqlalchemy import create_engine
 #using DSN
 engine = create_engine('mysql+pyodbc://4D_v11_Dev/DEFAULT_SCHEMA')
 #using URL
 engine = create_engine('mysql://user:p...@127.0.0.1', module='pyodbc')
 #another dialect with DSN = ERROR: AttributeError: 'str' object has
 no attribute 'paramstyle'
 engine = create_engine('mssql://4D_v11_Dev', module='pyodbc')
 # yet another try
 engine = create_engine('mysql+pyodbc://4D_v11_Dev')
 # show me output
 engine.echo = True
 
 None of those work, I have some stack traces, but the gist is this:
 # when used without a database name
 sqlalchemy.exc.DBAPIError: (Error) ('08004', '[08004] Server rejected
 the connection:\nFailed to parse statement.\r (1301)
 (SQLExecDirectW)') 'SELECT DATABASE()' ()
 
 # when I try to specify a name
 sqlalchemy.exc.DBAPIError: (Error) ('0', '[0] [iODBC][Driver
 Manager]dlopen({MySQL}, 6): image not found (0) (SQLDriverConnectW)')
 None None
 
 But connection directly via pyodbc does work
 import pyodbc
 cnxn = pyodbc.connect(DSN=4D_v11_Dev;UID=user;PWD=pass)
 cursor = cnxn.cursor()
 cursor.execute('select * from ODBCTest')
 a=cursor.fetchall()
 print 'pyodbc',a
 
 -- 
 You received this message because you are subscribed to the Google Groups 
 sqlalchemy group.
 To post to this group, send email to sqlalch...@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.
 

-- 
You received this message because you are subscribed to the Google Groups 
sqlalchemy group.
To post to this group, send email to sqlalch...@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.