Найти - Пользователи
Полная версия: Неудачный запрос к БД MS SQL 2008
Начало » Базы данных » Неудачный запрос к БД MS SQL 2008
1 2
Pr_Alexey
Здравствуйте!
Я начинающий 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 студии. Пробовал писать другие (тоже уже используемые ранее запросы) результат такой же: ничего не печатает, ошибок не выдает.
o7412369815963
Попробуйте pyodbc,
пример для linux, win
PooH
for i in cur.fetchall():
   # Данные в БД в кодировке cp1251, поэтому сначала переводим их в юникод
   i=unicode(i[1],'windows-1251')
   # А затем напечатаем их в utf-8 кодировке
   print "%s" % i

Не может так быть, что именно вторая колонка таблицы пустая? вы же заметили что меняете кодировку и печатаете только ее?
Pr_Alexey
PooH
Да нет, не пустая. На всякий случай попробовал такой запрос - select * from sys.tables where type_desc = ‘USER_TABLE’
результат тот же.
pyodbc попробую как-нибудь. Я про pymssql читал, поэтому жаль его бросать. А может для него тоже что-то надо в конфигах настраивать как для pyodbc? Я ни чего не настраивал.
Pr_Alexey
Добрый день! Хочу еще раз вернуться к вопросу, очень надо научится отправлять простые запросы к 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
Кажется я стал догадываться в чем дело, а оно во в этом - 192.168.0.2\sql2008r2. Если подумать, что это значит?
Это не IP, а что за бредятина? Правда именно такую ерунду и надо забивать в настройки студии, но это 100% не может быть адресом сервера, видимо студия сама как-то это преобразует в адрес+порт. Я прочитал, что эта приписка в конце означает “адрес экземпляра сервера”, что это такое на самом деле? как это учесть в python?
Pr_Alexey
Разобрался что значит 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()
тоже знаки вопроса.
Lexander
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
Pr_Alexey
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

Lexander
Укажите логин и пароль в pyodbc.connect.
Pr_Alexey
Видимо тут что-то я напутал, поэтому и питон не видит этой DNS
Проверьте тот ли файл правили и что в ODBC_BOTH_DSN.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB