[gelöst] MS SQL-Server aus Python via SQLRelay
-
- Beiträge: 27
- Registriert: 30.12.2005 03:16:14
[gelöst] MS SQL-Server aus Python via SQLRelay
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.
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.
Hi, Willkommen im Forum!
Du möchtest über unixodbc auf MS SQLServer zugreifen, dann benötigst du die Pakete "unixodbc" und "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:
<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
Ich habe zu hause keinen MS SQLServer und habe das jetzt hoffentlich richtig reproduziert.
Gruß
gms
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
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>
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
-
- Beiträge: 27
- Registriert: 30.12.2005 03:16:14
Soweit funktionert es sehr gut (Testen der Verbindung mit isql). Vielen Dank.gms hat geschrieben:Testen kannt du dann die Verbindung mit
Code: Alles auswählen
isql <dsn> <user> <password>
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
Das Programm "isql" verwendet ODBC und Python hat auch ein ODBC Interface. Theroetisch sollte es also funktionieren.Ingo Maurer hat geschrieben: Allerdings habe ich es nicht hinbekommen, dann aus python heraus auf diese Datenbank zuzugreifen.
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]
-
- Beiträge: 27
- Registriert: 30.12.2005 03:16:14
ODBC für Python
Danke daß du dich so kümmerst!
Schon das folgende 1-Zeilige Python-Script scheitert:
Fehlermeldung:
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):
[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]
Schon das folgende 1-Zeilige Python-Script scheitert:
Code: Alles auswählen
import odbc
Code: Alles auswählen
Traceback (most recent call last):
File "main.py", line 1, in ?
import odbc
ImportError: No module named 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
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]
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
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
-
- Beiträge: 27
- Registriert: 30.12.2005 03:16:14
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
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
zuerst habe ich folgende Pakete installiert
In der /etc/freetds/freetds.conf folgende Zeilen auskommentiert und angepaßt
Die /etc/sqlrelay/sqlrelay.conf angepaßt:
Danach nach mehrmaligen Starten vom sqlrelay folgende Verzeichnisse erstellt:
sqlrelay gestartet
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
Code: Alles auswählen
apt-get install sqlrelay-freetds python2.4-sqlrelay sqlrelay
Code: Alles auswählen
[MyServer2k]
host = HHHHHH
port = 1877
tds version = 8.0
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>
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/
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
Jetzt kann ich das nur nicht von python testen, habe noch keinen entsprechenden python code gefunden.
Gruß
gms
-
- Beiträge: 27
- Registriert: 30.12.2005 03:16:14
Fantastisch, es funktioniert!
In diesem Beispiel lasse ich nur die Server Versionsnummer ausgeben.
Ich bin dir sehr sehr dankbar für die geniale Hilfe, gms!
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
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!
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