Looks like the *nix version of the ODBC driver I was using is simply 
wrapping the Windows logic for parameters for DNS-less connections contrary 
to the documentation

For the record in Teradata for DNS-based connections the ODBC connection 
string would be on Linux:
'dsn=mydsn;Username=user;Password=pwd'

*BUT* for DNS-less connections the *nix version of the driver actually uses 
this connection string:
'driver=Teradata;UID=user;PWD=pwd'

Possibly they re-used the parsing logic from the Windows driver?  At any 
rate, thanks for the information.  That gave me the information I needed to 
figure out what was going on.

On Saturday, January 10, 2015 at 12:25:37 PM UTC-8, Lycovian wrote:
>
> TL;DR:
> I'm trying to debug what is actually being sent to the pyodbc.connect 
> function on connect in a custom dialect.  I need to see the connection 
> string that is being sent to the pyodbc.connect function *right* before 
> it is sent but it has been difficult for me to unravel the layers of 
> indirection on the create_engine call. 
>
> Long version:
> If you care for more information I have this DSN related connect string 
> for the custom dialect I am writing for Teradata:
> engine = 
> sqlalchemy.create_engine("teradata://testsqlatd:password@td_testsqlatd", 
> encoding='utf-8', echo=True)
>
> This connection string works and connects properly to my Teradata box 
> (yay!).
>
> In my custom dialect I have subclassed so I can get some visibility into 
> the ODBC connect string SQLA is constructing:
>     def create_connect_args(self, url):
>         connector = super(TeradataDialect_pyodbc, 
> self).create_connect_args(url)
>         print connector
>         return connector
>
> This code appears to call sqlalchemy/connectors/pyodbc.py 
> [create_connect_args].  And returns:
> [['dsn=td_testsqlatd;UID=testsqlatd;PWD=password'], {}]
>
> I assume that this string is roughly what is passed by SQLA to pyodbc at 
> some future point as the ODBC connection string.  In my case the string 
> above connects successfully.  Oddly enough though UID is not a valid ODBC 
> connection parameter for the Teradata ODBC driver.  For Teradata the 
> parameter *must *be Username.  Same with PWD, this isn't valid for the 
> Teradata ODBC driver.  It should be Password. 
>
> According to my testing and the Teradata ODBC docs the valid version of 
> this ODBC connection string should be:
> 'dsn=td_testsqlatd;Username=testsqlatd;Password=password'
>
> I have verified directly with pyodbc that the first form of the connect 
> string fails and the version directly above works, yet somehow in 
> SQLAlchemy it connects.  Because of this I believe that SQLA is rewriting 
> the string further before connecting to the Teradata ODBC driver via 
> pyodbc.  I can't find out where that is happening though.  Because of 
> this I would like to intercept the pyodbc.connect call and see exactly 
> what ODBC connection string SQLA is invoking it with. 
>
> Any ideas how to log what exactly the connection string that SQLAlchemy is 
> sending to pyodbc.connect?
>

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to