Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
phenom
7 лет назад

Подключение к MS SQL из unix подобных систем на примере БД блокчейна Голос

Ко мне несколько раз обращались с вопросами о том, как используя ОС Unix получить информацию из системы управления реляционными базами данных (РСУБД) Microsoft SQL Server. Я решил написать небольшой путеводитель, который, надеюсь, поможет “первопроходцам” сэкономить немного времени. Несмотря на то, что данная РСУБД разработана компанией Microsoft, она может успешно применяться и на unix-подобных системах, используя unixODBC (open database connectivity) интерфейсы.

Итак, не вдаваясь в исторические справки перейдем к сути. Для подключения к БД необходимо выполнить следующую последовательность действий:

  • Установить TDS (Tabular Data Stream) протокол, установив проект FreeTDS, который по умолчанию включает в себя ODBC интерфейс. Устанавливаем следующие пакеты:
    sudo apt-get install unixodbc unixodbc-dev freetds-dev tdsodbc freetds-bin

  • Настраиваем FreeTDS скопировав приведенный ниже конфиг в

/etc/freetds/freetds.conf

Настройки указываем свои для БД к которой вы хотите подключиться. Я в качестве примера здесь и далее буду использовать MS SQL базу данных блокчейна Голос, поддерживаемую пользователем @arcange

# $Id: freetds.conf,v 1.12 2007/12/25 06:02:36 jklowden Exp $
#
# This file is installed by FreeTDS if no file by the same 
# name is found in the installation directory.  
#
# For information about the layout of this file and its settings, 
# see the freetds.conf manpage "man freetds.conf".  

# Global settings are overridden by those in a database
# server specific section
[global]
        # TDS protocol version
        tds version = 8.0
        client charset = UTF-8

        # Whether to write a TDSDUMP file for diagnostic purposes
        # (setting this to /tmp is insecure on a multi-user system)
;       dump file = /tmp/freetds.log
;       debug flags = 0xffff

        # Command and connection timeouts
;       timeout = 10
;       connect timeout = 10

        # If you get out-of-memory errors, it may mean that your client
        # is trying to allocate a huge buffer for a TEXT field.  
        # Try setting 'text size' to a more reasonable limit 
        text size = 64512

# Golos server 
[golosserver]
        host = sql.golos.cloud
        port = 1433
        tds version = 8.0
  1. Проверяем, можем ли мы подключиться к базе данных, используя утилиту tsql

tsql -S <SERVERNAME> -U <USERNAME>@<HOST> -P <PASSWORD>

На примере рабочей БД, вводим в коммадной строке:

tsql -S golosserver -U golos -P golos

image alt

Если вывод такой же, как на скриншоте выше, значит FreeTDS настроен правильно. Используя tsql вы можете отправлять SQL запросы прямо из коммандной строки.

Если вдруг подключиться не удалось, то разбор всех возможных ошибок смотрим по этой ссылке

  • Настраиваем интерфейс ODBC, скопировав приведенные ниже конфиги в соответствующие пути, предварительно задав настройки для своих конкретных БД:

--- /etc/odbcinst.ini ---

[FreeTDS]
Description=TDS driver (Sybase/MS SQL)
Driver=/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup=/usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
CPTimeout=
CPReuse=
FileUsage=1
UsageCount=2

--- /etc/odbc.ini ---


[golosDSN]
Driver = FreeTDS
Description = ODBC connection via FreeTDS to Golos db
Trace = No
Server = sql.golos.cloud
Port = 1433
#TDS Version = 7.0
#Servername = golosserver
Database = DBGolos

Более подробно о FreeTDS можно почитать по этой ссылке

  • Теперь всё готово к тому, чтобы подключаться к БД прямо из кода программы.

Я для этих целей использую python. Вот пример простенького кода, выполняеющего SQL запрос, который выводит всех авторов и заголовки комментариев, в тексте которых содержится упоминание @phenom.


import pyodbc
import pdb
from pprint import pprint

# Create connection
#set Data Source Name that we have in /etc/odbc.ini config
dsn = 'golosDSN'
user = 'golos'
password = 'golos'
database = 'DBGolos'
#make sure you use version of tds driver not less than 7.0 otherwise it'll not
#work
tds_ver  = '8.0'

command = 'DSN=%s;UID=%s;PWD=%s;DATABASE=%s;TDS_Version=%s' % (dsn, user, password, database,tds_ver)

con = pyodbc.connect(command)
cur = con.cursor()
db_cmd = """SELECT author, title
            FROM TxComments 
            WHERE CONTAINS(body, '@phenom')"""


res = cur.execute(db_cmd)

pprint(res.fetchall())

Надеюсь этот небольшой гайд оказался для вас полезным.

Подписывайтесь на обновления и голосуйте за моего делегата!

vote_for_witness your_id phenom true true




28
1508.142 GOLOS
Комментарии (5)
Сортировать по:
Сначала старые