[gelöst] MS SQL-Server aus Python via SQLRelay

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
Antworten
Ingo Maurer
Beiträge: 27
Registriert: 30.12.2005 03:16:14

[gelöst] MS SQL-Server aus Python via SQLRelay

Beitrag von Ingo Maurer » 30.12.2005 03:37:39

Hallo!

Ich habe folgende Situation: ein Debian Sarge Server steht neben einem Windows 2000 Rechner mit MS SQL-Server.

Nun möchte ich vom Debian aus über ODBC auf den MS SQL-Server zugreifen. Die ODBC Schnittstelle soll aber auf dem Debian-System sein.

[edit]
In diesem Thread geht es dann schliesslich um den Zugriff auf MS SQL-Server in einem Python-Skript via SQLRelay und nicht via ODBC
[/edit]

Auf dem Debian Server dachte ich mir könnte ich das Paket sqlrelay-freetds installieren sowie das Paket unixodbc. (Meine naive Vorstellung: Über tds würde dann der MS SQL-Server angesprochen und unixodbc stellt auf dem Debian System dann die lokale ODBC-Schnittstelle zur Verfügung. ) Hört sich irgendwie gut an aber ist für mich bislang nur Theorie.

Kann mir jemand sagen, ob ich da auf dem richigen Weg bin? Ich möchte dann am liebsten nur mit Debian Paketen arbeiten aus der stable.

Nachtrag: Ich brauche lediglich Select sowie Insert und Update mit Transaktionen.

Danke für Eure Hilfe!

Ingo

PS: Ich hoffe ich hab das Unterforum richtig gewählt.
Zuletzt geändert von Ingo Maurer am 16.01.2006 00:09:56, insgesamt 1-mal geändert.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 30.12.2005 17:44:58

Hi, Willkommen im Forum!

Du möchtest über unixodbc auf MS SQLServer zugreifen, dann benötigst du die Pakete "unixodbc" und "tdsodbc".

Code: Alles auswählen

apt-get install unixodbc tdsodbc
Die Frage "Do you want FreeTDS to be registered as an ODBC driver?" beantwortest du mit "yes".

Danach tragst du folgendes in die /etc/odbc.ini ein:

Code: Alles auswählen

[<dsn>]
Description  = 
Driver          = FreeTDS
Server         = <host or ip>
Database     = <database>
UID               =
PWD             =
Port              = <port>
<dsn>, <host or ip>, <database> und <port> durch deine Werte ersetzen, wobei <dsn> ein beliebiger Name ist. Der Standardport vom SQLServer ist 1433.

Testen kannt du dann die Verbindung mit

Code: Alles auswählen

isql <dsn> <user> <password>

Ich habe zu hause keinen MS SQLServer :) und habe das jetzt hoffentlich richtig reproduziert.

Gruß
gms

Ingo Maurer
Beiträge: 27
Registriert: 30.12.2005 03:16:14

Beitrag von Ingo Maurer » 08.01.2006 18:06:23

gms hat geschrieben:Testen kannt du dann die Verbindung mit

Code: Alles auswählen

isql <dsn> <user> <password>
Soweit funktionert es sehr gut (Testen der Verbindung mit isql). Vielen Dank.

Allerdings habe ich es nicht hinbekommen, dann aus python heraus auf diese Datenbank zuzugreifen.

Vielleicht ist es doch nicht so eine gute Idee, die Verbindung auf dem Debian Rechner über ein lokales ODBC herzustellen?

Daher meine neu formulierte Frage:

Wie greife ich am besten von einem Python Skript auf einer Debian Sarge Maschine auf einen MS SQL Server im LAN zu?

Ich habe jetzte über Stunden hier verschiedene Versuche gemacht mit Paketen wie sqlrelay-freetds und python2.4-sqlrelay, kriege es aber irgendwie nicht hin.

Danke für Eure Hilfe!
Ingo

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 08.01.2006 18:20:45

Ingo Maurer hat geschrieben: Allerdings habe ich es nicht hinbekommen, dann aus python heraus auf diese Datenbank zuzugreifen.
Das Programm "isql" verwendet ODBC und Python hat auch ein ODBC Interface. Theroetisch sollte es also funktionieren.
Was bekommst du den für Fehler ?
Ich kann das leider erst morgen in der Firma testen. Kannst du vielleicht das Python-Script auf NoPaste posten, dann tu ich mir leichter. (In Python habe ich noch nie gescriptet.)

Gruß
gms

[edit]
Hast du es auch mit Python über ODBC versucht ?
[/edit]

Ingo Maurer
Beiträge: 27
Registriert: 30.12.2005 03:16:14

ODBC für Python

Beitrag von Ingo Maurer » 08.01.2006 21:26:22

Danke daß du dich so kümmerst!

Schon das folgende 1-Zeilige Python-Script scheitert:

Code: Alles auswählen

import odbc
Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "main.py", line 1, in ?
    import odbc
ImportError: No module named odbc
Ich weiß nicht, wie ich Python unter Linux ODBC beibringe. Unter Windows gibt es eine freie API, für Linux habe ich allerdings nur mxODBC gefunden, aber das ist nicht frei. Nungut, vielleicht könnte man das ja irgendwie finanzieren. Freie Software einzusetzen wäre mir aber viel lieber. Und wie gesagt, ich bestehe ja garnicht auf ODBC.

MxODBC ist von der Firma Egenix (http://www.egenix.com) und es gibt auch gleichnamige Debian Pakete (z.B. python-egenix-mxtools - collection of new builtins for Python [dummy package]) und bei Egenix kann ich nur rpms runterladen. Was ist denn ein Dummy Package? (Hört sich vom Vornamen her an als wäre es das richtige für mich ;-) )

Es gibt dann noch ein Debian Paket python-sqlrelay in der unstable. Mir ist allerdings überhaupt nicht klar, wie ich das dann ohne ODBC aufbauen kann.

MS SQL -> TDS -> SQLRELAY -> PYTHON-SQLRELAY -> PYTHON ?

Oder so:

MS SQL -> TDS -> PYTHON-SQLRELAY -> PYTHON ?

So würde übrigens in Python ein Dump der Tabelle Artikel der ODBC-Verbindung odbc_test ausgegeben (aus dem Kopf, ungetestet):

Code: Alles auswählen

import odbc
connection=odbc.odbc("odbc_test")
if (connection.error):
                print 'Fehler, kein Datenbankzugriff'
else:
                cur = odbc.cursor()
                cur.execute('select * from Artikel')
                while 1:
                        rec = cur.fetchmany(10)
                        if not rec: break
                        print rec
[edit]
Ich habe mir eine Lizenz für mxODBC besorgt, ich werde nun versuchen es zu installieren. Ich vermute dieses Dummy Package hilft mir dabei. Bin ja mal gespannt.

Die Lizenz ist trotzdem für mich nur die Notlösung. Erstens ist es eine Testlizenz, und ich muß es ja nicht kaufen, wenn ich innerhalb der Testphase die andere Lösung finde. Außerdem gilt sie nur für einen Rechner. Und wenn sich hier die freie Lösung findet, dann hätten alle was davon.
[/edit]

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 10.01.2006 21:31:51

Bin leider bis jetzt nicht zu meinen Tests gekommen, werde mich damit leider erst am Donnerstag beschäftigen können.
Das Python ODBC-mäßig so schwach auf der Brust ist, hat mich allerdings ziemlich überrascht. Das habe ich wirklich nicht für möglich gehalten.
Ein kommerzielles Packet, eines (pyodbc) steckt seit über zwei Jahren in der "Planungsphase" und eines nur für Win32, sind keine große Ausbeute.
Dabei, selbst wenn der Win32 Code fürchterlich geschrieben wäre, müßte eine Portierung von Win32 auf Linux (32 bit) eigentlich in einigen Tagen möglich sein.

so stelle ich mir das mit dem Sqlrelay vor (ohne mich damit bisher wirklich beschäftigt zu haben):

MS SQL
freetds
sqlrelay-freetds-daeomon
sqlrelay
python-sqlrelay
python


Gruß
gms

Ingo Maurer
Beiträge: 27
Registriert: 30.12.2005 03:16:14

Beitrag von Ingo Maurer » 11.01.2006 18:47:03

Deine Ausführungen decken sich mit dem, was ich auch vermute bzw. bis jetzt herausgefunden habe.

Die Pakteverwaltung habe ich leider noch nicht so wirklich verstanden. Wobei ich bei meinen vielfältigen Versiuchen jedoch hängegngeblieben war, war der Umstand, daß das Paket python2.4-sqlrelay sich nicht mit dem Paket sqlrelay-freetds verträgt. (Ich hoffe daß ich mich da jetzt richtig erinnere). Auf jeden Fall war es so, daß ich diese Kette, so wie du sie beschrieben hast, nicht aufbauen konnte. Das kann natürlich auch ein Bedienungsfeher meinerseits sein.

Ich erwäge es gelegentlich nochmal zu wiederholen und dabei die Meldungen genau mitzuloggen.

Gruß
Robert

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von gms » 13.01.2006 17:06:03

zuerst habe ich folgende Pakete installiert

Code: Alles auswählen

apt-get install sqlrelay-freetds python2.4-sqlrelay sqlrelay
In der /etc/freetds/freetds.conf folgende Zeilen auskommentiert und angepaßt

Code: Alles auswählen

[MyServer2k]
        host = HHHHHH
        port = 1877
        tds version = 8.0
Die /etc/sqlrelay/sqlrelay.conf angepaßt:

Code: Alles auswählen

<?xml version="1.0"?>
<!DOCTYPE instances SYSTEM "sqlrelay.dtd">
<instances>
        <instance id="example" port="9000" socket="/tmp/example.socket" dbase="freetds" connections="3" maxconnections="15" maxqueuelength="5" growby="1" ttl="60" endofsession="commit" sessiontimeout="600" runasuser="nobody" runasgroup="nobody" cursors="5" authtier="listener" handoff="pass" deniedips="" allowedips="" debug="none">
                <users>
                        <user user="UUUUUU" password="PPPPPP"/>
                </users>
                <connections>
                        <connection connectionid="db1" string="freetds=/etc/freetds;user=UUUUUU;password=PPPPPP;server=MyServer2k;db=DDDDDD" metric="1"/>
                </connections>
        </instance>
</instances>
Danach nach mehrmaligen Starten vom sqlrelay folgende Verzeichnisse erstellt:

Code: Alles auswählen

mkdir /var/cache/sqlrelay/tmp/ipc
mkdir /var/cache/sqlrelay/tmp/sockets
mkdir /var/cache/sqlrelay/tmp/pids
chown -R sqlrelay:sqlrelay  /var/cache/sqlrelay/tmp
chmod -R og+rw  /var/cache/sqlrelay/tmp/
sqlrelay gestartet

Code: Alles auswählen

root@gms1:~# sqlr-start -id example

Starting listener:
  sqlr-listener -id example -config /etc/sqlrelay/sqlrelay.conf

Starting 3 connections to db1 :
  sqlr-connection-freetds -id example -connectionid db1 -config /etc/sqlrelay/sqlrelay.conf
  sqlr-connection-freetds -id example -connectionid db1 -config /etc/sqlrelay/sqlrelay.conf
  sqlr-connection-freetds -id example -connectionid db1 -config /etc/sqlrelay/sqlrelay.conf

Starting scaler:
  sqlr-scaler  -id example -config /etc/sqlrelay/sqlrelay.conf

Starting cache manager:
  sqlr-cachemanager
DIe Connections sind auch tatsächlich im Enterprise Manager zu finden :)

Jetzt kann ich das nur nicht von python testen, habe noch keinen entsprechenden python code gefunden.

Gruß
gms

Ingo Maurer
Beiträge: 27
Registriert: 30.12.2005 03:16:14

Beitrag von Ingo Maurer » 16.01.2006 00:05:33

Fantastisch, es funktioniert!

Code: Alles auswählen

# Python Code:
from SQLRelay import PySQLRClient
con=PySQLRClient.sqlrconnection('localhost',9000,'','user1','pw1',0,1)
if con.ping():
        print "connection Port:", con.getConnectionPort()
        cur.sendQuery('Select Serverproperty(\'ProductVersion\')')
        con.endSession()
        for row in range(0,cur.rowCount()):
                for col in range(0,cur.colCount())
                        rowarray=cur.getRow(row)
                        print rowarray[col],
                print
else:
        print 'Fehler, kein Datenbankzugriff.'

In diesem Beispiel lasse ich nur die Server Versionsnummer ausgeben.

Ich bin dir sehr sehr dankbar für die geniale Hilfe, gms! :D :D :D
Ich hätte wohl ansonsten die Flinte ins Korn werfen müssen.

Für den Code habe ich mich hier inspirieren lassen:
http://sqlrelay.sourceforge.net/sqlrela ... ython.html
http://webdyn.dsi.cnrs.fr/Stock/connexionsqlserver.txt

Herzliche Grüße
Ingo

Antworten