SQLAlchemy and adodbapi Database connection error

2.2k views Asked by At

I'm attempting to connect to a mssql SQLExpress 2012 database using sqlalchemy 0.7.8 and adodapi 2.4.2.2 on IronPython 2.7.3

I am able to create a sqlalchemy engine, however when a query is made I get : "TypeError: 'NoneType' object is unsubscriptable"

TraceBack:

Traceback (most recent call last):
  File "C:\Program Files (x86)\IronPython 2.7\Lib\site-packages\SQLAlchemy-0.7.8-py2.7.egg\sqlalchemy\engine\base.py", line 878, in __init__
  File "C:\Program Files (x86)\IronPython 2.7\Lib\site-packages\SQLAlchemy-0.7.8-py2.7.egg\sqlalchemy\engine\base.py", line 2558, in raw_connection
  File "C:\Program Files (x86)\IronPython 2.7\Lib\site-packages\SQLAlchemy-0.7.8-py2.7.egg\sqlalchemy\pool.py", line 183, in unique_connection
  File "<string>", line 9, in <module>
  File "C:\Program Files (x86)\IronPython 2.7\Lib\site-packages\SQLAlchemy-0.7.8-py2.7.egg\sqlalchemy\engine\base.py", line 2472, in connect
TypeError: 'NoneType' object is unsubscriptable

Code being used:

def conn():
    return adodbapi.connect('Provider=SQLOLEDB; Data Source=SERVER\SQLEXPRESS; 
                             Initial Catalog=db; User ID=user; Password=pass;')
engine = create_engine('mssql+adodbapi:///', creator=conn, 
                        echo = True, module=adodbapi)

adodbapi seems to work fine on it's own, ie. i can create a connection and then use a cursor to query without any problems, it seems to be something in sqlalchemy.

Anyone any ideas?

3

There are 3 answers

0
Sigma On BEST ANSWER

And we have a workaround:

import adodbapi
from sqlalchemy.engine import create_engine
from sqlalchemy.orm import sessionmaker
import sqlalchemy.pool as pool

def connect():
    return adodbapi.connect('Provider=SQLOLEDB.1;Data Source=mypcname\SQLEXPRESS;\
                         Initial Catalog=dbname;User ID=user; Password=pass;')

mypool = pool.QueuePool(connect)
conn = mypool.connect()
curs = conn.cursor()
curs.execute('select 1') #anything that forces open the connection

engine = create_engine('mssql+adodbapi://', module=adodbapi, pool = mypool)

Session = sessionmaker()
Session.configure(bind=engine)
sess = Session()

With this my session object works as normal.

I'm probably not using the adodbapi dialect as intended by whoever made it, but I can't find any documentation, so this is what I've gone with for now.

2
Jacob George On

I use sqlalcmy to connect to a postgresql database using the psycopg2. I am not sure, but by reading the documentation, i think you need to download the pyodbc, it seems to be better supported than adodbapi. Once you have installed it, try the following statement to create the engine

engine = create_engine(mssql+pyodbc://user:pass@host/db)

Or you can check out different ways of writing the connection string here.

1
Tony Gibbs On

Pretty sure adodbapi doesn't work with SQLAlchemy.

The adodbapi dialect is not implemented for 0.6 at this time.

Scroll to the very bottom, (this is 0.7x documentation), I also checked 0.8 documentation and it says the same thing.

Sounds like you'll have to change which driver you're using.