Форум сайта python.su
Здравствуйте !
Есть проблема. Имею в наличии Оракл8, в настройки которого не имею возможности лазить. В настройках там стоит разделитель десятичного разряда запятая, что при использовании с питонскими модулями типа pyODBC и ceODBC выливается в проблему преобразования чисел в десятичной точкой в ошибку decimal.InvalidOperation: Invalid literal for Decimal: ‘16,01’.
Вычитал что надо менять сессию alter session set NLS_NUMERIC_CHARACTERS='.,', но выполнив cursor.execute(“alter session set NLS_NUMERIC_CHARACTERS='.,'”); никакого положительного эффекта не получаю :(
Если все это воспроизводить в SQL*Plus ораклячем, то все меняется как надо.
Подскажите куда копать или что я не так делаю.
Офлайн
А commit делали?
Офлайн
Да, делал, приведу кусок кода, ну точнее весь код теста :)
connection = ceODBC.connect("DSN=supermag;UID=***;PWD=***")
cursor = connection.cursor()
cursor.execute("alter session set NLS_NUMERIC_CHARACTERS='.,'");
connection.commit()
cursor.execute("Тут запрос с выбокой")
for c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12 in cursor:
print "Values:", c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12
Traceback (most recent call last):
File "C:\Documents and Settings\da4nik\workspace\smexport\src\main.py", line 44, in <module>
ceodbc_test()
File "C:\Documents and Settings\da4nik\workspace\smexport\src\model\support.py", line 130, in ceodbc_test
for c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12 in cursor:
File "C:\Temp\da4nik\Python26\lib\decimal.py", line 545, in __new__
"Invalid literal for Decimal: %r" % value)
File "C:\Temp\da4nik\Python26\lib\decimal.py", line 3719, in _raise_error
raise error(explanation)
decimal.InvalidOperation: Invalid literal for Decimal: '16,01'
Офлайн
cx_oracle имеет inputtypehandler/outputtypehandler в connection, которыми можно скрутить мозги у Decimal.
Как это делать для ceODBC - понятия не имею
Офлайн
Спасибо за наводку :) нашел аналогичную фигню в pyodbc, называется add_output_converter, но там не получилось подобрать тип данных, чоб забиндить. Может ещё не вполне работает.
Офлайн
Не знаю. Мне попробовать не на чем.
Пример для cx_oracle есть в недрах sqlalchemy
Офлайн