Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 27, 2013 13:17:57

Pr_Alexey
Зарегистрирован: 2013-02-27
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Неудачный запрос к БД MS SQL 2008

Здравствуйте!
Я начинающий python пользователь, пытаюсь работать с БД MS SQL 2008 экспресс вот такой программой (взято из книжки):

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Импортируем библиотеку для работы с MSSQL
import pymssql
# Соединение с БД. Если вы не в том-же домене, что и сервер БД, то вместо
# ИМЯ_КОМПЬЮТЕРА впишите его IP.
con = pymssql.connect(host='192.168.0.2', user='sa', password='111', database='SocPortal')
# Создаем курсор для работы с соединением
cur = con.cursor()
# Выполняем запрос
cur.execute("select * from dbo.EService_Response;")
# Прокручиваем все записи из запроса
for i in cur.fetchall():
   # Данные в БД в кодировке cp1251, поэтому сначала переводим их в юникод
   i=unicode(i[1],'windows-1251')
   # А затем напечатаем их в utf-8 кодировке
   print "%s" % i
# Подтверждаем транзакцию и закрываем соединение
con.commit()
con.close()
Скрипт возвращает пустое значение, ничего не печатает. Но данный запрос - select * from dbo.EService_Response на самом деле возвращает довольно большую таблицу из 50 записей. Проверено с помощью SQL студии. Пробовал писать другие (тоже уже используемые ранее запросы) результат такой же: ничего не печатает, ошибок не выдает.

Отредактировано Pr_Alexey (Фев. 27, 2013 13:34:57)

Офлайн

#2 Фев. 28, 2013 13:15:21

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Неудачный запрос к БД MS SQL 2008

Офлайн

#3 Март 1, 2013 04:56:06

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Неудачный запрос к БД MS SQL 2008

for i in cur.fetchall():
   # Данные в БД в кодировке cp1251, поэтому сначала переводим их в юникод
   i=unicode(i[1],'windows-1251')
   # А затем напечатаем их в utf-8 кодировке
   print "%s" % i

Не может так быть, что именно вторая колонка таблицы пустая? вы же заметили что меняете кодировку и печатаете только ее?



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#4 Март 1, 2013 13:48:07

Pr_Alexey
Зарегистрирован: 2013-02-27
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Неудачный запрос к БД MS SQL 2008

PooH
Да нет, не пустая. На всякий случай попробовал такой запрос - select * from sys.tables where type_desc = ‘USER_TABLE’
результат тот же.
pyodbc попробую как-нибудь. Я про pymssql читал, поэтому жаль его бросать. А может для него тоже что-то надо в конфигах настраивать как для pyodbc? Я ни чего не настраивал.

Отредактировано Pr_Alexey (Март 1, 2013 13:48:30)

Офлайн

#5 Авг. 1, 2013 11:39:31

Pr_Alexey
Зарегистрирован: 2013-02-27
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Неудачный запрос к БД MS SQL 2008

Добрый день! Хочу еще раз вернуться к вопросу, очень надо научится отправлять простые запросы к MSSQL2008/R2

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Импортируем библиотеку для работы с MSSQL
import pymssql
# Соединение с БД. Если вы не в том-же домене, что и сервер БД, то вместо
# ИМЯ_КОМПЬЮТЕРА впишите его IP.
con = pymssql.connect(host='192.168.0.2\sql2008r2', user='admin', password='123', database='Portal')
# Создаем курсор для работы с соединением
cur = con.cursor()
# Выполняем запрос
cur.execute('SELECT * FROM dbo.EService_Social')
# Прокручиваем все записи из запроса
for i in cur.fetchall():
   # Данные в БД в кодировке cp1251, поэтому сначала переводим их в юникод
   i=unicode(i[0],'windows-1251')
   # А затем напечатаем их в utf-8 кодировке
   print "%s" % i.encode('utf-8')
# Подтверждаем транзакцию и закрываем соединение
con.commit()
con.close()
Пишу такую программку, но она ничего не выводит на консоль, даже ошибок. Этот же запрос (SELECT * FROM dbo.EService_Social) выполненный в MS Studio выдает результат большую таблицу, что я делаю не так?

Отредактировано Pr_Alexey (Авг. 1, 2013 11:40:04)

Офлайн

#6 Авг. 1, 2013 15:42:31

Pr_Alexey
Зарегистрирован: 2013-02-27
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Неудачный запрос к БД MS SQL 2008

Кажется я стал догадываться в чем дело, а оно во в этом - 192.168.0.2\sql2008r2. Если подумать, что это значит?
Это не IP, а что за бредятина? Правда именно такую ерунду и надо забивать в настройки студии, но это 100% не может быть адресом сервера, видимо студия сама как-то это преобразует в адрес+порт. Я прочитал, что эта приписка в конце означает “адрес экземпляра сервера”, что это такое на самом деле? как это учесть в python?

Отредактировано Pr_Alexey (Авг. 1, 2013 15:48:31)

Офлайн

#7 Авг. 2, 2013 12:58:50

Pr_Alexey
Зарегистрирован: 2013-02-27
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Неудачный запрос к БД MS SQL 2008

Разобрался что значит 192.168.0.2\sql2008r2, если коротко это такая штука которая обозначает порт, в моем случае 49224.
Добился некоторого результата с такой программой (используя pyodbc):

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pyodbc
con = pyodbc.connect('DRIVER=FreeTDS;SERVER=192.168.0.2;PORT=49224;DATABASE=SocPortal;UID=sa;PWD=111;TDS_Version=8.0;')
cur = con.cursor()
# Прокручиваем все записи из запроса
for row in cur.execute('SELECT CHANGE_DATE,COMMENT FROM PROTOCOL WHERE DATEDIFF(dd,[CHANGE_DATE], GETDATE()) < 2'):
   print "%s" % row.COMMENT
# Подтверждаем транзакцию и закрываем соединение
con.commit()
con.close()
Но в результате вместо всех русских букв ????? Как это лечить? Попробовал конструкцию аналогичную
cur.execute("SELECT CHANGE_DATE,COMMENT FROM PROTOCOL WHERE DATEDIFF(dd,[CHANGE_DATE], GETDATE()) < 2")
# Прокручиваем все записи из запроса
for i in cur.fetchall():
   # Данные в БД в кодировке cp1251, поэтому сначала переводим их в юникод
   i=unicode(i[1],'windows-1251')
   # А затем напечатаем их в utf-8 кодировке
   print "%s" % i.encode('utf-8')
# Подтверждаем транзакцию и закрываем соединение
con.commit()
con.close()
тоже знаки вопроса.

Отредактировано Pr_Alexey (Авг. 2, 2013 13:33:53)

Офлайн

#8 Авг. 2, 2013 16:00:53

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Неудачный запрос к БД MS SQL 2008

Pr_Alexey
Разобрался что значит 192.168.0.2\sql2008r2, если коротко это такая штука которая обозначает порт
Это именованный инстанс - так и называется.
Если соединение через порт, то он указывается через запятую после IP.
http://www.connectionstrings.com/sql-server-2008/

По кодировке.
Дайте DDL таблицы.
Проверьте /etc/odbcinst.ini, раздел FreeTDS.

Подключитесь из консоли к серверу с использованием ваших настроек и посмотрите какие настройки выведет.
http://alah-my.blogspot.com/2013/02/microsoft-sql-server-odbc-ubuntu-1204.html



Офлайн

#9 Авг. 5, 2013 08:26:12

Pr_Alexey
Зарегистрирован: 2013-02-27
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Неудачный запрос к БД MS SQL 2008

Lexander
Подключитесь из консоли к серверу с использованием ваших настроек и посмотрите какие настройки выведет.
http://alah-my.blogspot.com/2013/02/microsoft-sql-server-odbc-ubuntu-1204.html
Спасибо за помощь, очень содержательная статья, все делал по ней, даже записываю результаты в wiki - http://wiki.tulalinux.ru/doku.php?id=art:log_analis (тут можно и настроечные файлы посмотреть)
Что получилось:
1) установил драйвер FreeTDS и он работает - соединяется с БД, корректно отображает русские символы
2) установил и настроил ODBC (как проверить незнаю).
Почитал документацию и т.к. у меня есть настроенный odbc:
$ odbcinst -s -q
[2008r2]
переделал строку в своей программе: con = pyodbc.connect('DSN=2008r2'), при запуске выдает ошибку:
$ ./mssql1.py 
Traceback (most recent call last):
File "./mssql1.py", line 4, in <module>
con = pyodbc.connect('DSN=2008r2')
pyodbc.Error: ('08001', '[08001] [unixODBC][FreeTDS][SQL Server]Unable to connect to data source (0) (SQLDriverConnectW)')
И еще я не понял почему у меня не работает удаление DSN:
$ odbcinst -s -q
[2008r2]
$ sudo odbcinst -u -s -n 2008r2
odbcinst: DSN removed (if it existed at all). ODBC_BOTH_DSN was used as the search path.
$ odbcinst -s -q
[2008r2]
Видимо тут что-то я напутал, поэтому и питон не видит этой DNS

Отредактировано Pr_Alexey (Авг. 5, 2013 08:45:14)

Офлайн

#10 Авг. 5, 2013 09:43:43

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Неудачный запрос к БД MS SQL 2008

Укажите логин и пароль в pyodbc.connect.

Pr_Alexey
Видимо тут что-то я напутал, поэтому и питон не видит этой DNS
Проверьте тот ли файл правили и что в ODBC_BOTH_DSN.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version