[_mssql] keine Daten

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
taake
User
Beiträge: 125
Registriert: Donnerstag 14. Oktober 2010, 08:49

Moin,

ich hab ein kleines Problem und weiß nicht wirklich woran es liegt, kann nicht mal mit Sicherheit sagen dass das problem von Python kommt, aber da es ein Python script ist frag ich mal hier.

Und zwar folgendes mini script

Code: Alles auswählen

#!/usr/bin/python2.7

import _mssql

conn = _mssql.connect(server='<server-ip>', user='<user>', password='<pass>', database='<DB-Name>')
result = conn.execute_query("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS")
print result
Das Problem ist das ich als Ergebniss None zurückbekomme und ich nicht verstehe warum.
Die Datenbank connection funktioniert, wenn ich mir den Traffic anschaue dann bekomme ich die Daten vom Imformation_schema.

Kann mir irgendjemand hier nen Tipp geben woran das ganze liegt?

Bzw. würde es eigentlich lieber mit sqlachlemy machen, allerdings kriege ich ihn nicht dazu sich mit dem mssql server zu verbinden.
Aber das primäre problem ist defintiv das ausbleiben der (vorhandenen) daten.
BlackJack

@taake: Also erst einmal solltest Du es IMHO sein lassen ein Modul zu verwenden was nicht dazu gedacht ist von Dir verwendet zu werden. Der führende Unterstrich im Modulnamen sagt ja es ist keine öffentliche API. Such Dir das Modul welches tatsächlich verwendet werden soll.

Wenn Du das gefunden hast, führe nichts auf der Verbindung aus, sondern lass Dir von der Verbindung einen Cursor geben, wie das von der DB-API 2.0 vorgesehen ist. Da gibt es dann auch Methoden um nach dem `execute()` die Ergebnisse abzufragen.

Edit: Welches Python-Paket verwendest Du denn *eigentlich* um die Verbindung herzustellen und was genau klappt da nicht bei SQLAlchemy?

Edit2: Wahrscheinlich `pymssql` — So hiesse dann auch das Modul das Du importieren solltest.
taake
User
Beiträge: 125
Registriert: Donnerstag 14. Oktober 2010, 08:49

Na ja es war das einzige was zumindest halb funktioniert hat ... aber okay der Einwand ist dennoch berechtigt.

Habs jetzt mal mit sqalchemy versucht, aber es scheitert einfach alles, scheiss mssql ...

Hab mir mal ein paar examples im netz angeschaut
so sieht es im moment aus:

Code: Alles auswählen

#!/usr/bin/python2.7

import sqlalchemy
import pyodbc
def connect():
    pyodbc.connect('Driver=freetds;Server=<server-ip>;Database=<db-name>;UID=<user>;PWD=<passwd>;TDS_Version=8.0;Port=1433;')

engine = sqlalchemy.create_engine('mssql://', creator=connect)

connection = engine.connect()
result = connection.execute("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS")

for row in result:
    print row

result.close()
connection.close
verreckt allerdings:

Code: Alles auswählen

Traceback (most recent call last):
  File "workbench/database/ms_sql_connect.py", line 17, in <module>
    connection = engine.connect()
  File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 1641, in connect
    return self._connection_cls(self, **kwargs)
  File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 59, in __init__
    self.__connection = connection or engine.raw_connection()
  File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 1699, in raw_connection
    return self.pool.unique_connection()
  File "/usr/lib64/python2.7/site-packages/sqlalchemy/pool.py", line 220, in unique_connection
    return _ConnectionFairy(self).checkout()
  File "/usr/lib64/python2.7/site-packages/sqlalchemy/pool.py", line 425, in __init__
    rec = self._connection_record = pool._do_get()
  File "/usr/lib64/python2.7/site-packages/sqlalchemy/pool.py", line 777, in _do_get
    con = self._create_connection()
  File "/usr/lib64/python2.7/site-packages/sqlalchemy/pool.py", line 225, in _create_connection
    return _ConnectionRecord(self)
  File "/usr/lib64/python2.7/site-packages/sqlalchemy/pool.py", line 318, in __init__
    self.connection = self.__connect()
  File "/usr/lib64/python2.7/site-packages/sqlalchemy/pool.py", line 368, in __connect
    connection = self.__pool._creator()
  File "workbench/database/ms_sql_connect.py", line 10, in connect
    pyodbc.connect('Driver=freetds;Server=<server-ip>;Database=<db-name>;UID=<user>;PWD=<pass>;TDS_Version=8.0;Port=1433;')
pyodbc.Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'freetds' : file not found (0) (SQLDriverConnect)")
Wenn ich es richtig verstanden habe dann liest er die /etc/unixODBC/odbc.ini aus
die enthält folgendes:

Code: Alles auswählen

[freetds]
Driver          = /usr/lib64/libtdsodbc.so
#Setup          = 
ServerName      = <server-ip>
User            = <user>
Password        = <pass>
# If the database you want to connect to is the default
# for the SQL Server login, omit this attribute
Database        = <db-name>
Mitlerweile würde ich mich auch damit zufrieden geben wenn ich irgendwie querys an den mssql server stellen könnte und ich die antwort von eben diesen bekommen würde, wenn also jemand weiß wies z.b. ohne sqlalchemy läuft dann nehm ich auch das :roll:
BlackJack

@taake: Und was passiert wenn Du das mit ODBC mal weglässt und `pymssql` mit SQLAlchemy so verwendest wie es dort in der Dokumentation beschrieben ist?

Ansonsten: Ist die Bibliothek für `freetds` denn installiert? Das ist es ja was laut Fehlermeldung nicht gefunden werden kann. ODBC braucht ja für konkrete Datenbanken dann noch den passenden Treiber.
taake
User
Beiträge: 125
Registriert: Donnerstag 14. Oktober 2010, 08:49

so habs mal so geändert das er jetzt pymssql nutzen soll.
HowTo

Code: Alles auswählen

#!/usr/bin/python2.7
import sqlalchemy
import pymssql

engine = sqlalchemy.create_engine('mssql+pymssql:<user>:<pass>@Navision?charset=utf8')

connection = engine.connect()
result = connection.execute("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS")

for row in result:
    print row

result.close()
connection.close
In der freetds.conf steht folgendes:

Code: Alles auswählen

[global]
    tds version = 8.0
    text size = 64512
[Navision]
#    driver = /usr/lib64/libtdsodbc.so.0
    host = <server-ip>
    port = 1433
    tds version 8.0
    client charset = UTF8
Leider wird das ganze weiterhin mit ner Fehlermeldung quitiert, zwar ist die anders, aber änhlich hilfreich, zumindest für mich.

Code: Alles auswählen

Traceback (most recent call last):
  File "workbench/database/ms_sql_connect.py", line 15, in <module>
    engine = sqlalchemy.create_engine('mssql+pymssql:<user>:<pass>@Navision?charset=utf8')
  File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/__init__.py", line 332, in create_engine
    return strategy.create(*args, **kwargs)
  File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/strategies.py", line 48, in create
    u = url.make_url(name_or_url)
  File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/url.py", line 154, in make_url
    return _parse_rfc1738_args(name_or_url)
  File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/url.py", line 196, in _parse_rfc1738_args
    "Could not parse rfc1738 URL from string '%s'" % name)
sqlalchemy.exc.ArgumentError: Could not parse rfc1738 URL from string 'mssql+pymssql:<user>:<pass>@Navision?charset=utf8'


Edit: Hab gerade nochmal versucht das ganze wie an anderer Stelle im HowTo beschrieben mit urllib hinzubekommen also

Code: Alles auswählen

[...]
import urllib
connect_string = urllib.quote_plus('mssql+pymssql:<user>:<pass>@Navision?charset=utf8')
engine = sqlalchemy.create_engine(connect_string)
[...]

Die String ist jetzt zwar codiert aber die Fehlermelung ist immer noch fast unverändert.

Code: Alles auswählen

sqlalchemy.exc.ArgumentError: Could not parse rfc1738 URL from string 'mssql%2Bpymssql%3A<user>%3A<pass>%40Navision%3Fcharset%3Dutf8'
BlackJack

@taake: Vergleich noch mal die URL in der Dokumentation mit Deiner. Da fehlt ziemlich deutlich etwas.
taake
User
Beiträge: 125
Registriert: Donnerstag 14. Oktober 2010, 08:49

Was und wo fehlt denn dort ?
pymssql

Support for the Microsoft SQL Server database via the pymssql driver.
DBAPI

Documentation and download information (if applicable) for pymssql is available at: http://pymssql.sourceforge.net/
Connecting

Connect String:

mssql+pymssql://<username>:<password>@<freetds_name>?charset=utf8
BlackJack

@taake: Echt jetzt? Wenn Du die beiden URLs direkt vergleichst, siehst Du die '//' nicht? Du musst wohl noch 'nen Kaffee trinken. :-)
taake
User
Beiträge: 125
Registriert: Donnerstag 14. Oktober 2010, 08:49

Einen? :)
Und ja du hast recht das hab ich mal konsiquent ignoriert. :oops:

Nachdem ich urllib wieder aus dem spiel genommen habe, habe ich auch das gefühl einen kleinen schritt weiter zu sein.
Traceback (most recent call last):
File "workbench/database/ms_sql_connect.py", line 20, in <module>
connection = engine.connect()
File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 1641, in connect
return self._connection_cls(self, **kwargs)
File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 59, in __init__
self.__connection = connection or engine.raw_connection()
File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/base.py", line 1699, in raw_connection
return self.pool.unique_connection()
File "/usr/lib64/python2.7/site-packages/sqlalchemy/pool.py", line 220, in unique_connection
return _ConnectionFairy(self).checkout()
File "/usr/lib64/python2.7/site-packages/sqlalchemy/pool.py", line 425, in __init__
rec = self._connection_record = pool._do_get()
File "/usr/lib64/python2.7/site-packages/sqlalchemy/pool.py", line 777, in _do_get
con = self._create_connection()
File "/usr/lib64/python2.7/site-packages/sqlalchemy/pool.py", line 225, in _create_connection
return _ConnectionRecord(self)
File "/usr/lib64/python2.7/site-packages/sqlalchemy/pool.py", line 318, in __init__
self.connection = self.__connect()
File "/usr/lib64/python2.7/site-packages/sqlalchemy/pool.py", line 368, in __connect
connection = self.__pool._creator()
File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/strategies.py", line 80, in connect
return dialect.connect(*cargs, **cparams)
File "/usr/lib64/python2.7/site-packages/sqlalchemy/engine/default.py", line 283, in connect
return self.dbapi.connect(*cargs, **cparams)
File "/usr/lib64/python2.7/site-packages/pymssql.py", line 609, in connect
raise InterfaceError, e[0]
sqlalchemy.exc.InterfaceError: (InterfaceError) Connection to the database failed for an unknown reason. None None
Der Fehler scheint im Moment daher zu kommen das er den Navision Eintrag nicht aus der FreeTDS.conf nimmt, jedenfalls fragt er meine definierten nameserver nach 'Navision?charset=utf8'

Mal sehen vielleicht fällt mir nach dem nächsten Kaffee was :D

Edit: Der FreeTDS Eintrag scheint soweit in Ordnung zu sein

Code: Alles auswählen

$: tsql -S Navision -U <user>
Password: 
locale is "de_DE.UTF-8"
locale charset is "UTF-8"
using default charset "UTF8"
1> 
Edit 2:

Gut noch ein Schritt weiter, scheinbar gehört '?charset=utf8' nicht wirklich in den connect string (trotz anders lautendem howto), jedenfalls kriegt er connection, auch wenn sie direkt wegstirbt :)

Erstmal Danke, meld mich wieder wenn sie stable läuft (vielleicht interessiert es ja irgendwenn irgendwann mal) oder ich wieder in probleme renne :)
Antworten