It ended up being a unicode issue. I had to set this: supports_unicode_binds=False (see Unicde Binds here http://docs.sqlalchemy.org/en/rel_0_9/dialects/mssql.html#module-sqlalchemy.dialects.mssql.pyodbc), in order to get it to work. Annoying, to say the least!
python test_connect.py 2014-08-18 16:15:06,611 INFO sqlalchemy.engine.base.Engine SELECT default_schema_name FROM sys.database_principals WHERE principal_id=database_principal_id() 2014-08-18 16:15:06,611 INFO sqlalchemy.engine.base.Engine () 2014-08-18 16:15:06,613 DEBUG sqlalchemy.engine.base.Engine Col ('default_schema_name',) 2014-08-18 16:15:06,614 DEBUG sqlalchemy.engine.base.Engine Row (u'dbo', ) 2014-08-18 16:15:06,616 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1 2014-08-18 16:15:06,616 INFO sqlalchemy.engine.base.Engine () 2014-08-18 16:15:06,619 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS NVARCHAR(60)) AS anon_1 2014-08-18 16:15:06,619 INFO sqlalchemy.engine.base.Engine () <sqlalchemy.engine.base.Connection object at 0x101877ed0> 2014-08-18 16:15:06,639 INFO sqlalchemy.engine.base.Engine select 6 * 7 as [Result]; 2014-08-18 16:15:06,639 INFO sqlalchemy.engine.base.Engine () 2014-08-18 16:15:06,641 DEBUG sqlalchemy.engine.base.Engine Col ('Result',) 2014-08-18 16:15:06,641 DEBUG sqlalchemy.engine.base.Engine Row (42, ) 42 2014-08-18 16:15:06,647 INFO sqlalchemy.engine.base.Engine SELECT [TABLES_1].[TABLE_NAME] FROM [INFORMATION_SCHEMA].[TABLES] AS [TABLES_1] WHERE [TABLES_1].[TABLE_SCHEMA] = CAST(? AS NVARCHAR(max)) AND [TABLES_1].[TABLE_TYPE] = ? ORDER BY [TABLES_1].[TABLE_NAME] 2014-08-18 16:15:06,647 INFO sqlalchemy.engine.base.Engine ('dbo', 'BASE TABLE') 2014-08-18 16:15:06,663 DEBUG sqlalchemy.engine.base.Engine Col ('TABLE_NAME',) 2014-08-18 16:15:06,663 DEBUG sqlalchemy.engine.base.Engine Row (u'irb_desc', ) 2014-08-18 16:15:06,663 DEBUG sqlalchemy.engine.base.Engine Row (u'irbd', ) 2014-08-18 16:15:06,663 DEBUG sqlalchemy.engine.base.Engine Row (u'study_desc', ) 2014-08-18 16:15:06,664 DEBUG sqlalchemy.engine.base.Engine Row (u'study_irb', ) 2014-08-18 16:15:06,664 DEBUG sqlalchemy.engine.base.Engine Row (u'study_status', ) 2014-08-18 16:15:06,664 DEBUG sqlalchemy.engine.base.Engine Row (u'study_status_desc', ) 2014-08-18 16:15:06,664 DEBUG sqlalchemy.engine.base.Engine Row (u'study_subject', ) 2014-08-18 16:15:06,664 DEBUG sqlalchemy.engine.base.Engine Row (u'subj_desc', ) 2014-08-18 16:15:06,664 DEBUG sqlalchemy.engine.base.Engine Row (u'subj_status_desc', ) 2014-08-18 16:15:06,665 DEBUG sqlalchemy.engine.base.Engine Row (u'subject_status', ) 2014-08-18 16:15:06,665 DEBUG sqlalchemy.engine.base.Engine Row (u'sysdiagrams', ) Thanks all! Greg-- On Monday, August 18, 2014 1:08:55 PM UTC-5, Michael Bayer wrote: > > try the query as stated along with a pyodbc connection (e.g. conn = > pyodbc.connect(…); cursor = conn.cursor(); cursor.execute(<the statement>); > cursor.fetchall()). the way pyodbc is connecting might be changing things. > > > > On Aug 18, 2014, at 12:59 PM, Horcle <g...@umn.edu <javascript:>> wrote: > > Thanks for the heads up. Unfortunately, it did not help. In any case, the > issue appears to be that while the last query DOES return a record set when > run as straight up SQL on the server, it does not work as desirecd through > SQLAlchemy. > > More digging to be done. > > Greg-- > > On Monday, August 18, 2014 11:30:39 AM UTC-5, Simon King wrote: >> >> It looks like the code that runs the "SELECT default_schema_name" >> query has changed since the version you are running: >> >> https://bitbucket.org/zzzeek/sqlalchemy/commits/1fb4ad75a38c >> >> It might be worth upgrading to the latest release. >> >> Simon >> >> On Mon, Aug 18, 2014 at 5:22 PM, Horcle <g...@umn.edu> wrote: >> > Thanks, this does help. I was wondering why the return results had no >> values >> > given. >> > >> > Greg-- >> > >> > >> > On Monday, August 18, 2014 11:17:48 AM UTC-5, Simon King wrote: >> >> >> >> I think you are seeing, for each query: >> >> >> >> 1. The query itself >> >> 2. The parameters being passed in to the query >> >> 3. The names of the columns being returned >> >> 4. The returned rows, if any. >> >> >> >> So for example, the first thing that happens is: >> >> >> >> SELECT user_name() >> >> >> >> with no parameters >> >> >> >> () >> >> >> >> returning a result set containing a single column with no name: >> >> >> >> ('',) >> >> >> >> followed by a single row containing a single value, the unicode string >> >> "dbo": >> >> >> >> (u'dbo', ) >> >> >> >> The second query goes like this: >> >> >> >> SELECT default_schema_name FROM >> >> sys.database_principals >> >> WHERE name = ? >> >> AND type = 'S' >> >> >> >> Note the bound parameter ("name = ?"). The next line tells us that SA >> >> is sending the unicode string "dbo" for that parameter: >> >> >> >> (u'dbo',) >> >> >> >> The result set has a single column called 'default_schema_name': >> >> >> >> ('default_schema_name',) >> >> >> >> ...but there are no matching rows. >> >> >> >> Then a bit further along, SA is running this query: >> >> >> >> SELECT [TABLES_1].[TABLE_NAME] >> >> FROM [INFORMATION_SCHEMA].[TABLES] AS [TABLES_1] >> >> WHERE [TABLES_1].[TABLE_SCHEMA] = CAST(? AS NVARCHAR(max)) AND >> >> [TABLES_1].[TABLE_TYPE] = ? ORDER BY [TABLES_1].[TABLE_NAME] >> >> >> >> ...passing the parameters "dbo" and "BASE TABLE", but not getting any >> >> results back. >> >> >> >> I don't know anything about MS-SQL so can't tell you why that is, but >> >> perhaps you've got enough information to carry on digging? >> >> >> >> Hope that helps, >> >> >> >> Simon >> >> >> >> >> >> On Mon, Aug 18, 2014 at 4:27 PM, Horcle <g...@umn.edu> wrote: >> >> > Indeed! >> >> > >> >> > Here is the output: >> >> > >> >> > >> >> > gms$ python test_connect.py >> >> > 2014-08-18 10:17:28,095 INFO sqlalchemy.engine.base.Engine SELECT >> >> > user_name() >> >> > 2014-08-18 10:17:28,095 INFO sqlalchemy.engine.base.Engine () >> >> > 2014-08-18 10:17:28,097 DEBUG sqlalchemy.engine.base.Engine Col >> ('',) >> >> > 2014-08-18 10:17:28,098 DEBUG sqlalchemy.engine.base.Engine Row >> (u'dbo', >> >> > ) >> >> > 2014-08-18 10:17:28,099 INFO sqlalchemy.engine.base.Engine >> >> > SELECT default_schema_name FROM >> >> > sys.database_principals >> >> > WHERE name = ? >> >> > AND type = 'S' >> >> > >> >> > 2014-08-18 10:17:28,099 INFO sqlalchemy.engine.base.Engine (u'dbo',) >> >> > 2014-08-18 10:17:28,101 DEBUG sqlalchemy.engine.base.Engine Col >> >> > ('default_schema_name',) >> >> > 2014-08-18 10:17:28,103 INFO sqlalchemy.engine.base.Engine SELECT >> >> > CAST('test >> >> > plain returns' AS VARCHAR(60)) AS anon_1 >> >> > 2014-08-18 10:17:28,103 INFO sqlalchemy.engine.base.Engine () >> >> > 2014-08-18 10:17:28,106 INFO sqlalchemy.engine.base.Engine SELECT >> >> > CAST('test >> >> > unicode returns' AS NVARCHAR(60)) AS anon_1 >> >> > 2014-08-18 10:17:28,106 INFO sqlalchemy.engine.base.Engine () >> >> > <sqlalchemy.engine.base.Connection object at 0x101839490> >> >> > 2014-08-18 10:17:28,382 INFO sqlalchemy.engine.base.Engine select 6 >> * 7 >> >> > as >> >> > [Result]; >> >> > 2014-08-18 10:17:28,382 INFO sqlalchemy.engine.base.Engine () >> >> > 2014-08-18 10:17:28,384 DEBUG sqlalchemy.engine.base.Engine Col >> >> > ('Result',) >> >> > 2014-08-18 10:17:28,384 DEBUG sqlalchemy.engine.base.Engine Row (42, >> ) >> >> > 42 >> >> > 2014-08-18 10:17:28,389 INFO sqlalchemy.engine.base.Engine SELECT >> >> > [TABLES_1].[TABLE_NAME] >> >> > FROM [INFORMATION_SCHEMA].[TABLES] AS [TABLES_1] >> >> > WHERE [TABLES_1].[TABLE_SCHEMA] = CAST(? AS NVARCHAR(max)) AND >> >> > [TABLES_1].[TABLE_TYPE] = ? ORDER BY [TABLES_1].[TABLE_NAME] >> >> > 2014-08-18 10:17:28,389 INFO sqlalchemy.engine.base.Engine (u'dbo', >> >> > 'BASE >> >> > TABLE') >> >> > 2014-08-18 10:17:28,394 DEBUG sqlalchemy.engine.base.Engine Col >> >> > ('TABLE_NAME',) >> >> > A >> >> > >> >> > Not quite sure how to parse this? >> >> > >> >> > For example, is "u'dbo'" what is being used as the schema? >> >> > >> >> > Greg-- >> >> > >> >> > On Monday, August 18, 2014 10:05:09 AM UTC-5, Simon King wrote: >> >> >> >> >> >> On Mon, Aug 18, 2014 at 3:47 PM, Horcle <g...@umn.edu> wrote: >> >> >> > On Friday, August 15, 2014 8:28:41 PM UTC-5, Michael Bayer wrote: >> >> >> >> >> >> >> >> >> >> >> >> On Aug 15, 2014, at 5:03 PM, Greg Silverman <g...@umn.edu> >> wrote: >> >> >> >> >> >> >> >> >> >> >> >> Then, I thought, what if this is an SQLAlchemy issue. Looks to >> be. I >> >> >> >> ran >> >> >> >> the following script as a test: >> >> >> >> >> >> >> >> import pyodbc >> >> >> >> import sqlalchemy >> >> >> >> from sqlalchemy.engine import reflection >> >> >> >> from sqlalchemy.engine.reflection import Inspector >> >> >> >> >> >> >> >> def connect(): >> >> >> >> return pyodbc.connect( >> >> >> >> 'DRIVER={FreeTDS};SERVER=<ip_address>;' >> >> >> >> 'DATABASE=<db_name>;UID=test;PWD=test;port=1433;' >> >> >> >> 'TDS_Version=9.1;') >> >> >> >> engine = sqlalchemy.create_engine('mssql://', creator=connect) >> >> >> >> conn = engine.connect() >> >> >> >> print conn >> >> >> >> >> >> >> >> for row in engine.execute('select 6 * 7 as [Result];'): >> >> >> >> print row.Result >> >> >> >> >> >> >> >> insp = reflection.Inspector.from_engine(engine) >> >> >> >> table_name = 'irb_desc' >> >> >> >> table_names = insp.get_table_names() >> >> >> >> if table_name not in table_names: >> >> >> >> print 'A' >> >> >> >> >> >> >> >> Again, I am connecting fine with the database create.engine >> method >> >> >> >> (that >> >> >> >> is '42' is printing as expected), but when I run the >> >> >> >> inspector.get_table_names method with the given conditional it >> is >> >> >> >> printing >> >> >> >> the 'A' (I have tried other table names in the same database to >> >> >> >> which I >> >> >> >> added 'irbd_balance,' all with the same result. >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> what is the SQL output if you set echo=‘debug’; then, take the >> SQL >> >> >> >> you >> >> >> >> see and take a look at what it’s SELECTing so you can see what >> might >> >> >> >> be >> >> >> >> wrong. Probably some schema name setting or something like >> that. >> >> >> > >> >> >> > >> >> >> > >> >> >> > Thanks, I did not realize this was an option (actually, it is >> >> >> > echo=True, >> >> >> > but >> >> >> > at least I can see the SQL being sent). Hopefully this will lead >> me >> >> >> > to >> >> >> > an >> >> >> > answer. >> >> >> > >> >> >> >> >> >> "echo='debug'" will show you more information than "echo=True" (it >> >> >> shows the rows coming back as well as the query that is sent) >> >> >> >> >> >> Simon >> >> > >> >> > -- >> >> > 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 sqlalchemy+...@googlegroups.com. >> >> > To post to this group, send email to sqlal...@googlegroups.com. >> >> > Visit this group at http://groups.google.com/group/sqlalchemy. >> >> > For more options, visit https://groups.google.com/d/optout. >> > >> > -- >> > 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 sqlalchemy+...@googlegroups.com. >> > To post to this group, send email to sqlal...@googlegroups.com. >> > Visit this group at http://groups.google.com/group/sqlalchemy. >> > For more options, visit https://groups.google.com/d/optout. >> > > -- > 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 sqlalchemy+...@googlegroups.com <javascript:>. > To post to this group, send email to sqlal...@googlegroups.com > <javascript:>. > Visit this group at http://groups.google.com/group/sqlalchemy. > For more options, visit https://groups.google.com/d/optout. > > > -- 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 sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.