what happens if you run the SQL as a string through engine.execute()? engine.execute(u"select [Заказы].[Номер заказа] from [Заказы] where [Заказы].[Номер заказа] = '14-01-0001'")
? failing that, what about raw pyodbc? conn = pyodbc.connect(...) cursor = conn.cursor() cursor.execute(u"select [Заказы].[Номер заказа] from [Заказы] where [Заказы].[Номер заказа] = '14-01-0001'") (make sure to always use a u"" string) On Apr 18, 2014, at 5:52 PM, Timur Ozheghin <tozheg...@gmail.com> wrote: > thank you for your answer, Michael! > > definitely, pyodbc does not work either. but in different way =( > i'm working on ubuntu 12. i've install unixodbc from sources and now have > version 2.3 > other versions are correct > but it does not help > > here description is > > testing connection > $ isql -v DB user pwd > +---------------------------------------+ > | Connected! | > | | > | sql-statement | > | help [tablename] | > | quit | > | | > +---------------------------------------+ > SQL> select [Заказы].[Номер заказа] from [Заказы] where [Заказы].[Номер > заказа] = '14-01-0001' > +------------------------+ > | Номер заказа| > +------------------------+ > | 14-01-0001 | > +------------------------+ > SQLRowCount returns 1 > 1 rows fetched > > next i'm executing the code > engine = create_engine("mssql+pyodbc://%s:%s@DB" % (settings.RT_USER, > settings.RT_PWD), echo = True, encoding = 'utf8') > metadata = MetaData() > metadata.reflect(engine, only = [u"Заказы",]) # metadata is successfuly > reflected > orders = metadata.tables[u'Заказы'] > res = engine.execute(orders.select(orders.c[u'Номер заказа'] == > u'14-01-0001')) # error generator > > sqlalchemy select looks ok > INFO sqlalchemy.engine.base.Engine SELECT [Заказы].[Номер заказа], <... a lot > of fields ...> > FROM [Заказы] > WHERE [Заказы].[Номер заказа] = ? > 2014-04-19 01:43:14,825 INFO sqlalchemy.engine.base.Engine (u'14-01-0001',) > 2014-04-19 01:43:14,828 INFO sqlalchemy.engine.base.Engine ROLLBACK > > but exception follows > res = engine.execute(orders.select(orders.c[u'Номер заказа'] == > u'14-01-0001')) > File "python2.7/site-packages/sqlalchemy/engine/base.py", line 1682, in > execute > return connection.execute(statement, *multiparams, **params) > File "python2.7/site-packages/sqlalchemy/engine/base.py", line 720, in > execute > return meth(self, multiparams, params) > File "python2.7/site-packages/sqlalchemy/sql/elements.py", line 317, in > _execute_on_connection > return connection._execute_clauseelement(self, multiparams, params) > File "python2.7/site-packages/sqlalchemy/engine/base.py", line 817, in > _execute_clauseelement > compiled_sql, distilled_params > File "python2.7/site-packages/sqlalchemy/engine/base.py", line 947, in > _execute_context > context) > File "python2.7/site-packages/sqlalchemy/engine/base.py", line 1108, in > _handle_dbapi_exception > exc_info > File "python2.7/site-packages/sqlalchemy/util/compat.py", line 185, in > raise_from_cause > reraise(type(exception), exception, tb=exc_tb) > File "python2.7/site-packages/sqlalchemy/engine/base.py", line 940, in > _execute_context > context) > File "python2.7/site-packages/sqlalchemy/engine/default.py", line 435, in > do_execute > cursor.execute(statement, parameters) > sqlalchemy.exc.ProgrammingError: (ProgrammingError) ('42S02', "[42S02] > [FreeTDS][SQL Server]Invalid object name > '\xd0\x97\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb7\xd1\x8b'. (208) (SQLExecDirectW)") > 'SELECT > [\xd0\x97\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb7\xd1\x8b].[\xd0\x9d\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x80 > \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb7\xd0\xb0], > [\xd0\x97\xd0\xb0\xd0\xba\xd0\x > <... a lot of same garbage here ...> > > The same error is in the odbc log file > [ODBC][11715][1397857605.657008][SQLPrepare.c][192] > Entry: > Statement = 0x9ffc320 > SQL = [SELECT [Заказы].[Номер заказа], [Заказы].[Дата приема], > [Заказы].[Срок сдачи], [...][length = 2906 (SQL_NTS)] > [ODBC][11715][1397857605.657059][SQLPrepare.c][367] > Exit:[SQL_SUCCESS] > [ODBC][11715][1397857605.657087][SQLNumParams.c][140] > Entry: > Statement = 0x9ffc320 > Param Count = 0xbfab7c6c > [ODBC][11715][1397857605.657116][SQLNumParams.c][224] > Exit:[SQL_SUCCESS] > Count = 0xbfab7c6c -> 1 > [ODBC][11715][1397857605.657150][SQLBindParameter.c][213] > Entry: > Statement = 0x9ffc320 > Param Number = 1 > Param Type = 1 > C Type = -8 SQL_C_WCHAR > SQL Type = -9 SQL_WVARCHAR > Col Def = 10 > Scale = 0 > Rgb Value = 0x9f18640 > Value Max = 0 > StrLen Or Ind = 0x9b6ca8c > [ODBC][11715][1397857605.657182][SQLBindParameter.c][393] > Exit:[SQL_SUCCESS] > [ODBC][11715][1397857605.657210][SQLExecute.c][183] > Entry: > Statement = 0x9ffc320 > [ODBC][11715][1397857605.659126][SQLExecute.c][344] > Exit:[SQL_ERROR] > DIAG [42S02] [FreeTDS][SQL Server]Invalid object name 'Заказы'. > > DIAG [42000] [FreeTDS][SQL Server]Statement(s) could not be prepared. > > [ODBC][11715][1397857605.659246][SQLGetDiagRec.c][739] > Entry: > Statement = 0x9ffc320 > Rec Number = 1 > SQLState = 0xbfab7c46 > Native = 0xbfab7838 > Message Text = 0xbfab7840 > Buffer Length = 1023 > Text Len Ptr = 0xbfab783e > [ODBC][11715][1397857605.659285][SQLGetDiagRec.c][776] > Exit:[SQL_SUCCESS] > SQLState = 42S02 > Native = 0xbfab7838 -> 208 > Message Text = [[FreeTDS][SQL Server]Invalid object name > 'Заказы'.] > > It looks like odbc looses active database and switched somewhere else. > Because as you can see earlier isql works fine with this datasource and > similar "select" query. > > > 2014-04-18 23:13 GMT+04:00 Michael Bayer <mike...@zzzcomputing.com>: > its not clear pymssql supports this fully yet. Additionally you need to > make sure your freetds.conf file is set up correctly. Overall, using > non-ASCII identifiers is a tough road to travel for sure and if it can be > avoided, you should. However it can be done. > > I'm not able to get the most recent pymssql to work, but pyodbc does. > Versions are very important here: > > 1. UnixODBC 2.3.0 > 2. FreeTDS 0.91 > 3. Pyodbc 3.0.7 > 4. Linux, not OSX, OSX has tons of problems with tds / pyodbc, I'm running on > a Fedora 14 machine here > > Freetds setting: > > [sqlserver_2008_vmware] > host = 172.16.248.142 > port = 1213 > tds version = 7.2 > client charset = UTF8 > text size = 50000000 > > Test script: > > # coding: utf-8 > from sqlalchemy import create_engine, MetaData, Table, Column, String > > e = create_engine("mssql+pyodbc://scott:tiger@ms_2008", echo=True) > #e = create_engine("mssql+pymssql://scott:tiger@172.16.248.142:1213", > echo=True) > > m = MetaData() > > t = Table(u'Заказы', m, Column(u'Номер заказа', String(50))) > > m.drop_all(e) > m.create_all(e) > > orders = m.tables[u'Заказы'] > e.execute(orders.select(orders.c[u'Номер заказа'] == u'14-01-0001')) > > part of the output: > > CREATE TABLE [Заказы] ( > [Номер заказа] VARCHAR(50) NULL > ) > > > 2014-03-31 20:57:16,266 INFO sqlalchemy.engine.base.Engine () > 2014-03-31 20:57:16,268 INFO sqlalchemy.engine.base.Engine COMMIT > 2014-03-31 20:57:16,270 INFO sqlalchemy.engine.base.Engine SELECT > [Заказы].[Номер заказа] > FROM [Заказы] > WHERE [Заказы].[Номер заказа] = ? > 2014-03-31 20:57:16,270 INFO sqlalchemy.engine.base.Engine (u'14-01-0001',) > > > > > > > > > On Apr 18, 2014, at 2:48 PM, Timur Ozheghin <tozheg...@gmail.com> wrote: > >> may you provide an example of this? i've broke my mind for past three days, >> but can't get this code to work >> i'm using latest sqlalchemy and pymssql from pip >> >> engine = create_engine("mssql+pymssql://%s:%s@RTBD/rt?charset=utf8" % >> (settings.RT_USER, settings.RT_PWD), echo = True, encoding = 'utf8') >> metadata = MetaData() >> metadata.reflect(engine, only = [u"Заказы",]) >> orders = metadata.tables[u'Заказы'] >> engine.execute(orders.select(orders.c[u'Номер заказа'] == u'14-01-0001')) >> >> the exception is >> ValueError Traceback (most recent call last) >> <ipython-input-3-659410bb024c> in <module>() >> ----> 1 engine.execute(orders.select(orders.c[u'Номер заказа'] == >> u'14-01-0001')) >> >> python2.7/site-packages/sqlalchemy/engine/base.pyc in execute(self, >> statement, *multiparams, **params) >> 1680 >> 1681 connection = self.contextual_connect(close_with_result=True) >> -> 1682 return connection.execute(statement, *multiparams, **params) >> 1683 >> 1684 def scalar(self, statement, *multiparams, **params): >> >> python2.7/site-packages/sqlalchemy/engine/base.pyc in execute(self, object, >> *multiparams, **params) >> 718 type(object)) >> 719 else: >> --> 720 return meth(self, multiparams, params) >> 721 >> 722 def _execute_function(self, func, multiparams, params): >> >> python2.7/site-packages/sqlalchemy/sql/elements.pyc in >> _execute_on_connection(self, connection, multiparams, params) >> 315 >> 316 def _execute_on_connection(self, connection, multiparams, >> params): >> --> 317 return connection._execute_clauseelement(self, multiparams, >> params) >> 318 >> 319 def unique_params(self, *optionaldict, **kwargs): >> >> python2.7/site-packages/sqlalchemy/engine/base.pyc in >> _execute_clauseelement(self, elem, multiparams, params) >> 815 compiled_sql, >> 816 distilled_params, >> --> 817 compiled_sql, distilled_params >> 818 ) >> 819 if self._has_events or self.engine._has_events: >> >> python2.7/site-packages/sqlalchemy/engine/base.pyc in _execute_context(self, >> dialect, constructor, statement, parameters, *args) >> 945 parameters, >> 946 cursor, >> --> 947 context) >> 948 >> 949 if self._has_events or self.engine._has_events: >> >> python2.7/site-packages/sqlalchemy/engine/base.pyc in >> _handle_dbapi_exception(self, e, statement, parameters, cursor, context) >> 1109 ) >> 1110 >> -> 1111 util.reraise(*exc_info) >> 1112 >> 1113 finally: >> >> python2.7/site-packages/sqlalchemy/engine/base.pyc in _execute_context(self, >> dialect, constructor, statement, parameters, *args) >> 938 statement, >> 939 parameters, >> --> 940 context) >> 941 except Exception as e: >> 942 self._handle_dbapi_exception( >> >> python2.7/site-packages/sqlalchemy/engine/default.pyc in do_execute(self, >> cursor, statement, parameters, context) >> 433 >> 434 def do_execute(self, cursor, statement, parameters, >> context=None): >> --> 435 cursor.execute(statement, parameters) >> 436 >> 437 def do_execute_no_params(self, cursor, statement, context=None): >> >> python2.7/site-packages/pymssql.so in pymssql.Cursor.execute >> (pymssql.c:6057)() >> >> python2.7/site-packages/_mssql.so in _mssql.MSSQLConnection.execute_query >> (_mssql.c:9858)() >> >> python2.7/site-packages/_mssql.so in _mssql.MSSQLConnection.execute_query >> (_mssql.c:9734)() >> >> python2.7/site-packages/_mssql.so in >> _mssql.MSSQLConnection.format_and_run_query (_mssql.c:10814)() >> >> python2.7/site-packages/_mssql.so in >> _mssql.MSSQLConnection.format_sql_command (_mssql.c:11042)() >> >> python2.7/site-packages/_mssql.so in _mssql._substitute_params >> (_mssql.c:18359)() >> >> <type 'str'>: (<type 'exceptions.UnicodeEncodeError'>, >> UnicodeEncodeError('ascii', u'params dictionary did not contain value for >> placeholder: \u041d\u043e\u043c\u0435\u0440 >> \u0437\u0430\u043a\u0430\u0437\u0430_1', 57, 62, 'ordinal not in >> range(128)')) >> >> SQLAlchemy log is >> 2014-04-18 22:43:46,413 INFO sqlalchemy.engine.base.Engine SELECT >> [Заказы].[Номер заказа], <... a lot of fields here ...> >> FROM [Заказы] >> WHERE [Заказы].[Номер заказа] = %(Номер заказа_1)s >> 2014-04-18 22:43:46,414 INFO sqlalchemy.engine.base.Engine >> {'\xd0\x9d\xd0\xbe\xd0\xbc\xd0\xb5\xd1\x80 >> \xd0\xb7\xd0\xb0\xd0\xba\xd0\xb0\xd0\xb7\xd0\xb0_1': u'14-01-0001'} >> 2014-04-18 22:43:46,415 INFO sqlalchemy.engine.base.Engine ROLLBACK >> >> >> >> >> 2014-04-18 18:47 GMT+04:00 Michael Bayer <mike...@zzzcomputing.com>: >> yes, make sure you use Python unicode objects in Py2K (e.g. u'thename'). >> >> >> On Apr 18, 2014, at 8:06 AM, Belegnar Dragon <tozheg...@gmail.com> wrote: >> >>> Hello! >>> >>> Is it possible to handle with SQLAlchemy mssql database with cyrillic table >>> and column names? >>> >>> -- >>> WBR, >>> TO >>> >>> >>> -- >>> 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. >> >> >> -- >> You received this message because you are subscribed to a topic in the >> Google Groups "sqlalchemy" group. >> To unsubscribe from this topic, visit >> https://groups.google.com/d/topic/sqlalchemy/Cv8DzGRzA5M/unsubscribe. >> To unsubscribe from this group and all its topics, 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. >> >> >> >> -- >> Счастливой радости! >> Тимур Ожегин >> >> -- >> 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. > > > -- > You received this message because you are subscribed to a topic in the Google > Groups "sqlalchemy" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/sqlalchemy/Cv8DzGRzA5M/unsubscribe. > To unsubscribe from this group and all its topics, 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. > > > > -- > Счастливой радости! > Тимур Ожегин > > -- > 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. -- 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.