you likely need to specify convert_unicode=True on your create_engine(), you'll notice the u'dbo' being sent by SQLAlchemy whereas it is 'dbo' in your plain pyodbc example. pyodbc + freetds (which I'm guessing is used here) has a lot of problems with u'' strings.
On Feb 19, 2013, at 5:26 PM, Eugene Timmermans <eugenetimmerm...@gmail.com> wrote: > Hello! > I am getting a very similar error message but sqlalchemy but not in pyodbc. > My database is SQL EXPRESS 2008. > > Did you ever get a solution to your posts on Re: [sqlalchemy] SqlSoup > ProgrammingError The data types nvarchar and ntext are incompatible in the > equal operator > I am getting exactly the same error but in sqlalchemy. > I turned logging on and sqlalchemy reflected 5 larger tables with short names > and then choked at one with two rows but a long name. > Tables with more than 10 characters are not reflected by the sqlalchemy.Table > command when connected to sql server. > The statement sqlalchemy generates with table names > 10 characters errors > out but works in a pyodbc query. > > I noticed short table names were being reflected so I renamed one table to > have fewer than 11 characters and it was reflected. Long named tables work > in pyodbc > > I have shown the working query followed by the failed one. > > PYODBC connection: WORKS > > cnxn = pyodbc.connect('DRIVER={SQL > Server};SERVER=MADE_UP_HOST_NAME\SQLEXPRESS;DATABASE=MADE_UP_DB_NAME;UID=sa;PWD=MADE_UP_PASSWORD;') > > sqlStmt = "SELECT [COLUMNS_1].[TABLE_SCHEMA], [COLUMNS_1].[TABLE_NAME], > [COLUMNS_1].[COLUMN_NAME], [COLUMNS_1].[IS_NULLABLE], > [COLUMNS_1].[DATA_TYPE], [COLUMNS_1].[ORDINAL_POSITION], > [COLUMNS_1].[CHARACTER_MAXIMUM_LENGTH], [COLUMNS_1].[NUMERIC_PRECISION], > [COLUMNS_1].[NUMERIC_SCALE], [COLUMNS_1].[COLUMN_DEFAULT], > [COLUMNS_1].[COLLATION_NAME] FROM [INFORMATION_SCHEMA].[COLUMNS] AS > [COLUMNS_1] WHERE [COLUMNS_1].[TABLE_NAME] = ? AND [COLUMNS_1].[TABLE_SCHEMA] > = ? ORDER BY [COLUMNS_1].[ORDINAL_POSITION]" > cursor.execute(sqlStmt, 'site', 'dbo') > for row in cursor.fetchall(): > print row > cursor.execute(sqlStmt, 'taxonomy_species', 'dbo') > for row in cursor.fetchall(): > print row > > output: > (u'dbo', u'site', u'owned_date', 'NO', u'datetime2', 14, None, None, None, > None None) > (u'dbo', u'site', u'owned_by', 'NO', u'int', 15, None, 10, 0, None, None) > (u'dbo', u'taxonomy_species', u'taxonomy_species_id', 'NO', u'int', 1, None, > 10 0, None, None) > (u'dbo', u'taxonomy_species', u'current_taxonomy_species_id', 'YES', u'int', > 2,None, 10, 0, None, None) > (u'dbo', u'taxonomy_species', u'nomen_number', 'YES', u'int', 3, None, 10, 0, > None, None) > (u'dbo', u'taxonomy_species', u'is_specific_hybrid', 'NO', u'nvarchar', 4, 1, > None, None, None, u'SQL_Latin1_General_CP1_CI_AS') > > > SQLALCHEMY connection: DOESN'T WORK > import urllib > quoted = urllib.quote_plus('DRIVER={SQL > Server};SERVER=MADE_UP_HOST\SQLEXPRESS;DATABASE=MADE_UP_DB_NAME;UID=sa;PWD=MADE_UP_PASSWORD;') > db = > sqlalchemy.create_engine("mssql+pyodbc:///?odbc_connect={0}".format(quoted)) > > output: > INFO:sqlalchemy.engine.base.Engine:SELECT [C].[COLUMN_NAME], > [R].[TABLE_SCHEMA], [R].[TABLE_NAME], [R].[COLUMN_NAME], > [REFERENTIAL_CONSTRAINTS_1].[CONSTRAINT_NAME], > [REFERENTIAL_CONSTRAINTS_1].[MATCH_OPTION], > [REFERENTIAL_CONSTRAINTS_1].[UPDATE_RULE], > [REFERENTIAL_CONSTRAINTS_1].[DELETE_RULE] > FROM [INFORMATION_SCHEMA].[KEY_COLUMN_USAGE] AS [C], > [INFORMATION_SCHEMA].[KEY_COLUMN_USAGE] AS [R], > [INFORMATION_SCHEMA].[REFERENTIAL_CONSTRAINTS] AS [REFERENTIAL_CONSTRAINTS_1] > WHERE [C].[TABLE_NAME] = ? AND [C].[TABLE_SCHEMA] = ? AND > [C].[CONSTRAINT_NAME] = [REFERENTIAL_CONSTRAINTS_1].[CONSTRAINT_NAME] AND > [R].[CONSTRAINT_NAME] = [REFERENTIAL_CONSTRAINTS_1].[UNIQUE_CONSTRAINT_NAME] > AND [C].[ORDINAL_POSITION] = [R].[ORDINAL_POSITION] ORDER BY > [REFERENTIAL_CONSTRAINTS_1].[CONSTRAINT_NAME], [R].[ORDINAL_POSITION] > INFO:sqlalchemy.engine.base.Engine:(u'sys_lang', u'dbo') > INFO:sqlalchemy.engine.base.Engine:select ind.index_id, ind.is_unique, > ind.name from sys.indexes as ind join sys.tables as tab on > ind.object_id=tab.object_id join sys.schemas as sch on > sch.schema_id=tab.schema_id where tab.name = ? and sch.name=? and > ind.is_primary_key=0 > INFO:sqlalchemy.engine.base.Engine:(u'sys_lang', u'dbo') > . > . > . > INFO:sqlalchemy.engine.base.Engine:SELECT [COLUMNS_1].[TABLE_SCHEMA], > [COLUMNS_1].[TABLE_NAME], [COLUMNS_1].[COLUMN_NAME], > [COLUMNS_1].[IS_NULLABLE], [COLUMNS_1].[DATA_TYPE], > [COLUMNS_1].[ORDINAL_POSITION], [COLUMNS_1].[CHARACTER_MAXIMUM_LENGTH], > [COLUMNS_1].[NUMERIC_PRECISION], [COLUMNS_1].[NUMERIC_SCALE], > [COLUMNS_1].[COLUMN_DEFAULT], [COLUMNS_1].[COLLATION_NAME] > FROM [INFORMATION_SCHEMA].[COLUMNS] AS [COLUMNS_1] > WHERE [COLUMNS_1].[TABLE_NAME] = ? AND [COLUMNS_1].[TABLE_SCHEMA] = ? ORDER > BY [COLUMNS_1].[ORDINAL_POSITION] > INFO:sqlalchemy.engine.base.Engine:(u'taxonomy_species', u'dbo') > INFO:sqlalchemy.engine.base.Engine:ROLLBACK > . > . > . > sqlalchemy.exc.ProgrammingError: (ProgrammingError) ('42000', '[42000] > [Microsoft][ODBC SQL Server Driver][SQL Server]The data types nvarchar and > ntext are incompatible in the equal to operator. (402) (SQLExecDirectW); > [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not > be prepared. (8180)') u'SELECT [COLUMNS_1].[TABLE_SCHEMA], > [COLUMNS_1].[TABLE_NAME], [COLUMNS_1].[COLUMN_NAME], > [COLUMNS_1].[IS_NULLABLE], [COLUMNS_1].[DATA_TYPE], > [COLUMNS_1].[ORDINAL_POSITION], [COLUMNS_1].[CHARACTER_MAXIMUM_LENGTH], > [COLUMNS_1].[NUMERIC_PRECISION], [COLUMNS_1].[NUMERIC_SCALE], > [COLUMNS_1].[COLUMN_DEFAULT], [COLUMNS_1].[COLLATION_NAME] \nFROM > [INFORMATION_SCHEMA].[COLUMNS] AS [COLUMNS_1] \nWHERE > [COLUMNS_1].[TABLE_NAME] = ? AND [COLUMNS_1].[TABLE_SCHEMA] = ? ORDER BY > [COLUMNS_1].[ORDINAL_POSITION]' (u'taxonomy_species', u'dbo') > > Configuration > > Windows XP > > sqlalchemy.__version__ = 0.8.0b2 > > python version = 2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 > bit ( > Intel)] > > ODBC: > Microsoft SQL Server ODBC Driver Version 03.85.1132 > > Data Source Name: MADE_UP_DSN > Data Source Description: > Server: MADE_UP_NAME \SQLEXPRESS > Database: MADE_UP_DATABASE > Language: (Default) > Translate Character Data: Yes > Log Long Running Queries: No > Log Driver Statistics: No > Use Integrated Security: Yes > Use Regional Settings: No > Prepared Statements Option: Drop temporary procedures on disconnect > Use Failover Server: No > Use ANSI Quoted Identifiers: Yes > Use ANSI Null, Paddings and Warnings: Yes > Data Encryption: No > > Config: Sql Server 2008 Express > > BuildClrVersion v2.0.50727 > Collation Latin1_General_CI_AS > CollationID 53256 > ComparisonStyle 196609 > ComputerNamePhysicalNetBIOS MADE_UP_NAME > Edition Express Edition with Advanced Services > EditionID -133711905 > EngineEdition 4 > InstanceName SQLEXPRESS > IsClustered 0 > IsFullTextInstalled 0 > IsIntegratedSecurityOnly 0 > IsSingleUser 0 > LCID 1033 > LicenseType DISABLED > MachineName MADE_UP_NAME > NumLicenses NULL > ProcessID 1684 > ProductVersion 10.0.1600.22 > ProductLevel RTM > ResourceLastUpdateDateTime 2008-07-09 16:50:29.033 > ResourceVersion 10.00.1600 > ServerName MADE_UP_NAME \SQLEXPRESS > SqlCharSet 1 > SqlCharSetName iso_1 > SqlSortOrder 0 > SqlSortOrderName bin_ascii_8 > Eugene Timmermans > > > On Monday, January 24, 2011 6:17:44 PM UTC-6, Mark Sharp wrote: > I decided to try to get some reflection using SqlSoup on a MS SQL Server 2008 > database. > > This is a copy of my session with the DSN obfuscated. > >>> from sqlalchemy.ext.sqlsoup import SqlSoup > >>> engine1 = SqlSoup("mssql+pyodbc://mydsn") > >>> valid_species = db.valid_species.all() > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > NameError: name 'db' is not defined > >>> valid_species = engine1.valid_species.all() > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > File > "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/SQLAlchemy-0.6.6-py2.7.egg/sqlalchemy/ext/sqlsoup.py", > line 792, in __getattr__ > return self.entity(attr) > File > "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/SQLAlchemy-0.6.6-py2.7.egg/sqlalchemy/ext/sqlsoup.py", > line 789, in entity > return self.map_to(attr, tablename=attr, schema=schema) > File > "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/SQLAlchemy-0.6.6-py2.7.egg/sqlalchemy/ext/sqlsoup.py", > line 672, in map_to > schema=schema or self.schema) > File > "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/SQLAlchemy-0.6.6-py2.7.egg/sqlalchemy/schema.py", > line 210, in __new__ > table._init(name, metadata, *args, **kw) > File > "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/SQLAlchemy-0.6.6-py2.7.egg/sqlalchemy/schema.py", > line 258, in _init > include_columns=include_columns) > File > "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/SQLAlchemy-0.6.6-py2.7.egg/sqlalchemy/engine/base.py", > line 1863, in reflecttable > self.dialect.reflecttable(conn, table, include_columns) > File > "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/SQLAlchemy-0.6.6-py2.7.egg/sqlalchemy/engine/default.py", > line 228, in reflecttable > return insp.reflecttable(table, include_columns) > File > "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/SQLAlchemy-0.6.6-py2.7.egg/sqlalchemy/engine/reflection.py", > line 382, in reflecttable > for col_d in self.get_columns(table_name, schema, **tblkw): > File > "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/SQLAlchemy-0.6.6-py2.7.egg/sqlalchemy/engine/reflection.py", > line 229, in get_columns > **kw) > File "<string>", line 1, in <lambda> > File > "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/SQLAlchemy-0.6.6-py2.7.egg/sqlalchemy/engine/reflection.py", > line 46, in cache > ret = fn(self, con, *args, **kw) > File > "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/SQLAlchemy-0.6.6-py2.7.egg/sqlalchemy/dialects/mssql/base.py", > line 1244, in get_columns > c = connection.execute(s) > File > "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/SQLAlchemy-0.6.6-py2.7.egg/sqlalchemy/engine/base.py", > line 1191, in execute > params) > File > "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/SQLAlchemy-0.6.6-py2.7.egg/sqlalchemy/engine/base.py", > line 1271, in _execute_clauseelement > return self.__execute_context(context) > File > "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/SQLAlchemy-0.6.6-py2.7.egg/sqlalchemy/engine/base.py", > line 1302, in __execute_context > context.parameters[0], context=context) > File > "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/SQLAlchemy-0.6.6-py2.7.egg/sqlalchemy/engine/base.py", > line 1401, in _cursor_execute > context) > File > "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/SQLAlchemy-0.6.6-py2.7.egg/sqlalchemy/engine/base.py", > line 1394, in _cursor_execute > context) > File > "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/SQLAlchemy-0.6.6-py2.7.egg/sqlalchemy/engine/default.py", > line 299, in do_execute > cursor.execute(statement, parameters) > sqlalchemy.exc.ProgrammingError: (ProgrammingError) ('42000', '[42000] > [Actual][SQL Server] The data types nvarchar and ntext are incompatible in > the equal to operator. (402) (SQLExecDirectW)') u'SELECT > [COLUMNS_1].[TABLE_SCHEMA], [COLUMNS_1].[TABLE_NAME], > [COLUMNS_1].[COLUMN_NAME], [COLUMNS_1].[IS_NULLABLE], > [COLUMNS_1].[DATA_TYPE], [COLUMNS_1].[ORDINAL_POSITION], > [COLUMNS_1].[CHARACTER_MAXIMUM_LENGTH], [COLUMNS_1].[NUMERIC_PRECISION], > [COLUMNS_1].[NUMERIC_SCALE], [COLUMNS_1].[COLUMN_DEFAULT], > [COLUMNS_1].[COLLATION_NAME] \nFROM [INFORMATION_SCHEMA].[COLUMNS] AS > [COLUMNS_1] \nWHERE [COLUMNS_1].[TABLE_NAME] = ? AND > [COLUMNS_1].[TABLE_SCHEMA] = ? ORDER BY [COLUMNS_1].[ORDINAL_POSITION]' > (u'valid_species', u'dbo') > > R. Mark Sharp, Ph.D. > msh...@sfbr.org > > > > > > -- > 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?hl=en. > For more options, visit https://groups.google.com/groups/opt_out. > > -- 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?hl=en. For more options, visit https://groups.google.com/groups/opt_out.