pyodbc

Модераторы: Лабутин Сергей Евгеньевич, Алек(андр

pyodbc

Сообщение Rinat74 » 15 дек 2016 16:07

После сногсшибательного успеха предыдущей статьи решил написать еще одну. В телеграммном стиле. Последнюю, пожалуй.

С отказом от VBScript лишаемся возможности работы с базами Access, то есть с прайс-листом, c выгруженной в базу сценой и тому подобным. Нужно было решение, решение нашлось: pyodbc. Сборку брать тут, с учетом разрядности и версии Python. Отсутствующую версию для Python 3.3, для остающихся на К3 7.3, могу выложить отдельно, по запросу. Установка аналогична установке XlsxWriter. Извлекаем из архива файл с расширением pyd, название сокращаем до pyodbc.pyd, полученный файл бросаем в папку с остальными библиотеками. "Прописка" библиотеки также описана ранее.

Примеры использования доступны здесь. Немного о том, что там отсутствует.

Подключение к MS Access

base_path — путь к базе данных.

Код: Выделить всё
pyodbc.connect('Driver={Microsoft Access Driver (*.mdb)};DBQ=' + base_path, autocommit=True)


Параметрические запросы

Были проблемы с параметрическими запросами, а именно с целыми числами в запросах. Решение простое — переводить параметры из int во float. Можно делать это принудительно. params — параметры запроса.

Код: Выделить всё
params = [float(x) if type(x) is int else x for x in params]


Забыл упомянуть замечательные особенности pyodbc. Можно обращаться к полям в выборке по имени из запроса, а не по индексу, не забывая, что Python регистрозависимый язык. Кроме того, возвращаемая выборка есть итерируемый объект, поэтому можем перебирать ее в цикле, как какой-нибудь список.

Код: Выделить всё
cursor.execute("select user_id, user_name from users")
rows = cursor.fetchall()
for row in rows:
    print(row.user_id, row.user_name)
Rinat74
 
Сообщения: 39
Зарегистрирован: 16 сен 2011 09:29

Re: pyodbc

Сообщение Алек(андр » 16 дек 2016 11:15

Бурные аплодисменты докладчику. :)
Аватара пользователя
Алек(андр
 
Сообщения: 1153
Зарегистрирован: 17 ноя 2008 10:16
Откуда: Московская область

Re: pyodbc

Сообщение Алек(андр » 16 дек 2016 11:20

Да! на счет 3,3 версии. Это действительно недоверсия и значимые пакеты под нее найти достаточно сложно. Основной поддерживаемый на данный момент версией является 3,5. Надеюсь в ближайшее время 3,5 станет основной и в К3-мебель.
Аватара пользователя
Алек(андр
 
Сообщения: 1153
Зарегистрирован: 17 ноя 2008 10:16
Откуда: Московская область

Re: pyodbc

Сообщение Ручей » 17 дек 2016 10:32

Рекомендую использовать PyPyOdbc, а не PyOdbc. Не помню отличия, но существенные
Ручей
 
Сообщения: 873
Зарегистрирован: 15 июл 2011 19:55

Re: pyodbc

Сообщение Rinat74 » 17 дек 2016 12:57

А я в свою очередь не рекомендую, как не рекомендовал ее 1.5 года назад, отвечая Алек(андру в скайпе на ваш же вопрос. Я ее пробовал, собственно, на нее и перешел, когда столкнулся с описанной ранее проблемой в параметрических запросах pyodbc. Вот только на pypyodbc заморочек потом оказалось еще больше, что и заставило вернуться на pyodbc и найти решение проблемы.

Хотя это вопрос предпочтений, если понравилась и работает, то почему нет. Мне она кажется какой-то неряшливой и менее продуманной. Например, раньше она не умела обращаться к полям по имени, теперь, смотрю, умеет, но синтаксис мне лично не нравится.

Код: Выделить всё
# Какой-то запрос
client_name = row['client_name'] #pypyodbc

client_name = row.client_name   #pyodbc


Еще можно сослаться на статистику гитхаба, к pyodbc интерес много выше, чем к pypyodbc, который вообще кажется заброшенным проектом. Последняя версия была в мае 2014, хотя последний коммит 24 дня назад ("fix unixodbc on linux/mac decode bug", т.е. не про нашу честь фикс). Поддержка версии Python 3.5 не заявлена, хотя может быть просто не тестировалась под ним. Заведется под К3 7.4 или нет?

Впрочем, это все вкусовщина и ерунда. Можно, конечно, развести схоластические споры на тему красоты и удобства, но это будут споры о красоте и удобстве костылей, костылей к Access, ядреному такому атавизму как самому по себе, так и в К3. Причем этот атавизм проприетарный, от которого давно нужно было отказаться, не заставлять пользователей ставить версию Microsoft Office с Access и перейти на другие варианты, которым эти обобщенные интерфейсы нафиг не нужны, поскольку есть свои собственные, нативные интерфейсы. Хотя понятно, что ресурсы у Геоса не бесконечные, так просто не перескочишь.
Rinat74
 
Сообщения: 39
Зарегистрирован: 16 сен 2011 09:29

Re: pyodbc

Сообщение Ручей » 18 дек 2016 09:52

Я решил использовать pypyodbc, потому что pyodbc не умеет создавать БД, а только читает. Вроде так, уже не помню.

Сейчас слёту не нашёл обзора отличий этих модулей (на русском).
Если есть ссылка на такое сравнение или сами можете сравнить, поделитесь.
Читать доки на английском для меня проблема.
Если pyodbc умеет создавать базу и записывать в неё, а не только читать, т там удобнее получать доступ к полям, то лучше конечно её использовать.
На счёт, что К3 сидит на аксессе, тут есть свой минус, что надо устанавливать сам аксес.
Лучше бы иметь MySQL или PostgerSQL и свою оболочку работы с данными из К3, что бы изменения были на лету, а не перегружать К3.
Кстати, попалась тут краткая статейка, что лучше все использовать PostgerSQL , а не MySQL . У MySQL есть свои врождённые недостатки.
Да и почему-то после распаковки MySQL стал занимать 2Гб, а PostgerSQL 400Мб

Вопрос: pyodbc 311 для python 35 будет работать с python 33?
Ручей
 
Сообщения: 873
Зарегистрирован: 15 июл 2011 19:55

Re: pyodbc

Сообщение Rinat74 » 18 дек 2016 13:26

Обожаю этот форум. Пишешь, пишешь, отправляешь и вдруг тебе предлагают войти, хотя ты раньше вроде как вошел, но тебя, оказывается, уже заботливо выкинули. "Не успел, не успел, бе-бе-бе". И, разумеется, ты свою писанину не скопировал, забываешь про эти форумные "особенности". "Сам дурак, бе-бе-бе".

Повторный ответ завтра, сейчас слишком взволнован. Так много хочется сказать установщикам регламента.
Rinat74
 
Сообщения: 39
Зарегистрирован: 16 сен 2011 09:29

Re: pyodbc

Сообщение Ручей » 18 дек 2016 19:36

Rinat74 писал(а):Обожаю этот форум. Пишешь, пишешь, отправляешь и вдруг тебе предлагают войти, хотя ты раньше вроде как вошел, но тебя, оказывается, уже заботливо выкинули. "Не успел, не успел, бе-бе-бе". И, разумеется, ты свою писанину не скопировал, забываешь про эти форумные "особенности". "Сам дурак, бе-бе-бе".

Повторный ответ завтра, сейчас слишком взволнован. Так много хочется сказать установщикам регламента.

У меня была та же фигня. Только я историю в браузере откатил на пару страниц и моя писанина сохранилась.
У меня эта ерунда, если поставить галочку "Запомнить" при логировании. Имеет место в яндекс браузере в моём профиле. Если же создать другой чистый профиль, то этот форум запоминает и не вылетает. Хотя раньше такой ерунды не было.
Ручей
 
Сообщения: 873
Зарегистрирован: 15 июл 2011 19:55

Re: pyodbc

Сообщение Алек(андр » 19 дек 2016 10:36

Прочел пост Рината. И думаю надо бы пояснить парочку терминов. Поскольку сам я спотЫкнулся на паре этих самых умных слов.
Пояснения от модератора :)
1 Нативный интерфейс (от native – родной) –> это интерфейс программы предназначенный, в отличие от универсального, для определенного типа устройства (стационарного компьютера, планшета, ноутбука, мобильного телефона и т.д.) и его характеристик, операционной системы и т.д.

2 Cхоластические споры -> оторванные от жизни. Просто потрендеть. Можно но сложно. Нафиг никому не надо.

3 Пропиретарный атавизм. Тут все сложнее. Разобьем на части.
3.1 Атави́зм (от лат. atavus — отдалённый предок) — появление у данной особи признаков, свойственных отдалённым предкам, но отсутствующих у ближайших.
3.2 Слово «проприетарный» происходит от английского слова proprietary, что означает «личное» или «патентованное».
proprietary software обозначают программное обеспечение, которое имеет собственника ...

Осталось соединить. :)
proprietary atavus - некие свойства (особенности) Версии 4.07 проявившиеся в 7.3 :) Но отсутствующие у 7.1 :( Как то так!
Аватара пользователя
Алек(андр
 
Сообщения: 1153
Зарегистрирован: 17 ноя 2008 10:16
Откуда: Московская область

Re: pyodbc

Сообщение Алек(андр » 19 дек 2016 10:43

Для тех кто понимает -> ПКМ73 на основе Py35 если кому надо! Только ядро без модуля ЧПУ. МодульЧПУ на старом Python33.dll.
Аватара пользователя
Алек(андр
 
Сообщения: 1153
Зарегистрирован: 17 ноя 2008 10:16
Откуда: Московская область

Re: pyodbc

Сообщение Rinat74 » 19 дек 2016 20:08

...надо бы пояснить парочку терминов.


Да, надо бы кое-что пояснить. Тем более, когда ошибся. Вот так умничаешь, а потом краснеть приходится. Не атавизм, в данном случае, а рудимент, если еще точнее и совсем по-умному, то вестигий. Устаревшая хрень, пережиток, не до конца отвалившийся хвост. Это я про Microsoft Access, на котором построена база данных K3. Никаких его сказочных преимуществ не вижу. Но об этом ниже.

Я решил использовать pypyodbc, потому что pyodbc не умеет создавать БД, а только читает. Вроде так, уже не помню.


Действительно, проиндексировал исходники pyodbc, посмотрел, не умеет. Но только для Access не умеет, для SQL Server не проблема. Думаю, что дело в самом Access. Смотрю, как pypyodbc создает базу mdb, вижу обходной маневр и только под Windows.

Код: Выделить всё
def win_create_mdb(mdb_path, sort_order="General\0\0"):
    if sys.platform not in ('win32', 'cli'):
        raise Exception('This function is available for use in Windows only.')
    # .......................................................................................................
    # CREATE_DB=<path name> <sort order>
    ctypes.windll.ODBCCP32.SQLConfigDataSource.argtypes #............


pyodbc мог бы что-то похожее предложить, но почему-то не предлагает. Есть вроде подобный вариант создать mdb файл, вот только зачем? Одно дело, когда жизнь, под видом Геоса и K3, заставляет пользоваться Access, а самому-то зачем? Это я так к альтернативам перехожу.

Абстрактно рассуждая (кто нас будет спрашивать), хотел бы видеть вместо Access другую СУБД. SQLite, например (сейчас придет Алек(андр и будет ругаться). Для нужд прайс-листа и всяких таблиц сверловки за глаза хватит. Тот же принцип, одна база — один файл. Работает везде и на всем. Ничего качать и ставить не надо, никаких скачек с драйверами и бубном, доступна "из коробки" K3. Куча полноценных утилит во free вариантах (навскидку, 1, 2, 3). С ног до головы покрыта тестами, цитата с хабра:

покрытие кода тестами 100% (с августа 2009)
— причем это не просто покрытие тестами, а 100% branch coverage и 100 MC/DC покрытие, и вообще цифры покрытия тут совсем не главные, их можно было гораздо меньшими усилиями достичь, чем в sqlite это сделано.

Ни в каком другом open-source проекте такой помешанности на тестах не встречал. В sqlite кода тестов в 1000+ раз больше, чем собственно кода проекта, даже с учетом того, что многие тесты написаны на более высокоуровневом Tcl. Всем рекомендую почитать http://www.sqlite.org/testing.html — душераздирающее чтиво :)


MySQL или PostgreSQL, понятно, круче, особенно вторая, но как по мне, так это даже не из пушки по воробьям, это ковровая ядерная бомбардировка по муравьям. Тем более, что их нужно ставить, администрировать, совсем другие ресурсы потребуются. А поставочная база K3 на Access для тех клиентов, кого не смущает ведение прайс-листа на конструкторском компьютере и использование "народных" версий Microsoft Office.

Хотя прайс-лист вообще желательно из общей базы изъять ("советы постороннего", да), придумать некий обобщенный интерфейс, через который уже цеплять отдельную базу с прайс-листом, пусть даже на Access в качестве примера. Кому Access нафиг не сдался, мог бы через этот интерфейс что-то свое подвязывать. Я в свое время начинал двигаться в сторону 1С, но не успел. Да и тяжело это на "шестерке" было делать и одному, особенно, когда все это совершенно непонятно руководителю с очень средним образованием.

pyodbc 311 для python 35 будет работать с python 33?


А зачем это выяснять? Есть же pyodbc 3.07. Только опять потребуется установленный в систему Python.
Rinat74
 
Сообщения: 39
Зарегистрирован: 16 сен 2011 09:29


Вернуться в К3-Мебель. Программа для производства и продажи мебели.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron