Alternativen zu pymssql

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
febel
User
Beiträge: 5
Registriert: Montag 21. Mai 2007, 10:16

Alternativen zu pymssql

Beitragvon febel » Montag 18. Juni 2007, 12:58

Hallo Forum,

ich habe bisher pymssql genutzt um mit MS SQL Server zu arbeiten. Da aber pymssql keine Select-Abfragen über unicode-Spalten (nchar,nvarchar,ntext) zulässt (hier beschrieben), bin ich nun auf der Suche nach einer Alternative zu pymssql. Habt ihr Vorschläge, welche Erfahrungen habt ihr gemacht?

Gruß
febel
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Beitragvon Sr4l » Montag 18. Juni 2007, 14:12

Ich habe nun schon öfters von SQLAlchemy ( http://www.sqlalchemy.org/ ) gehört habe es mir jedoch noch nicht genau angeschaut. Ich denke ( nach meinem jetzigen Wissensstand) werde ich es bald einsetzen.
Was es genau kann oder ob es nur die verstreuten API Ansteuerungen unter eine Hut bringt weiß ich noch nicht. Dazu kann ja mal jemand was sagen.
Ich weiß auch nicht ob es bei deinem Problem hilft, aber du kannst es dir ja mal anschauen.

PS: z.Z nutze nur SQLite und Python-MySQLdb und bin recht glücklich damit :-)
rafael
User
Beiträge: 189
Registriert: Mittwoch 26. Juli 2006, 16:13

Beitragvon rafael » Montag 18. Juni 2007, 14:23

Soll es denn weiterhin ein MS SQL Server sein? Ansonsten empfehle ich SQLAlchemy, was für MS SQL pyodbc , adodbapi und pymssql unterstützt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Alternativen zu pymssql

Beitragvon gerold » Montag 18. Juni 2007, 14:49

febel hat geschrieben:bin ich nun auf der Suche nach einer Alternative zu pymssql.

Hallo febel!

Ich verwende "pyodbc" um mich mit MS-SQL-Datenbanken zu verbinden. Es funktioniert. Macht nicht so viele Probleme wie "pymssql", aber ich habe keine Unicode-Felder in meinen Datenbanken. Außerdem gibt es nicht einfach jeglichen Text als Unicode-String aus. Diesen muss man explizit umwandeln.

http://pyodbc.sourceforge.net/

Ich verbinde mich so zur Datenbank:

Code: Alles auswählen

# Verbinden
connstr = """
DRIVER=SQL Server;
UID=%s;
PWD=%s;
DATABASE=%s;
SERVER=%s;
APP=Microsoft Data Access Components;
""" % (
    username,
    password,
    database,
    host,
)
conn = pyodbc.connect(connstr)

Und das sind meine Umwandelfunktionen (Es fehlt noch teilweise die Ersetzung der Zeilenumbrüche):

Code: Alles auswählen

import pyodbc

SQL_ENCODING = "iso-8859-1"

def to_unicode(text):
    """
    Wandelt den Datenbanktext nach Unicode um und normalisiert die
    Zeilenumbrüche.
    """
   
    if text is None:
        return None
   
    text = text.replace("\r\n", "\n")
   
    if isinstance(text, str):
        return text.decode(SQL_ENCODING)
    else:
        return text


def to_dbstring(text):
    """
    Wandelt Unicode in das SQL-Encoding um. Nebenbei werden Zeilenumbrüche
    in das Windows-Format umgewandelt.
    """

    if text is None:
        return None
   
    text = text.replace("\r\n", "\n")
    text = text.replace("\n", "\r\n")
   
    if isinstance(text, unicode):
        return text.encode(SQL_ENCODING)
    else:
        return text


def row_to_unicode(row):
    """
    Läuft jedes Feld eines Datensatzes durch. Wenn ein Feld vom Typ `str` ist,
    dann wird es nach Unicode umgewandelt.
    """
   
    if row is None:
        return None
   
    new_row = []
    for field in row:
        if isinstance(field, str):
            new_row.append(field.decode(SQL_ENCODING))
        else:
            new_row.append(field)
   
    return new_row


def row_to_dbstring(row):
    """
    Läuft jedes Feld eines Datensatzes durch. Wenn ein Feld vom Typ `unicode` ist,
    dann wird es nach str umgewandelt. (SQL_ENCODING)
    """
   
    if row is None:
        return None
   
    new_row = []
    for field in row:
        if isinstance(field, unicode):
            new_row.append(field.encode(SQL_ENCODING))
        else:
            new_row.append(field)
   
    return new_row

Alles in Allem nicht ideal, aber es funktioniert. :-|

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Montag 18. Juni 2007, 17:25

SQLAlchemy und SQLObject sind Abstraktionsschichten für den Datenbankzugriff, die aber ihrerseits auf ein entsprechendes Connector-Paket zur verwendeten Datenbank angewiesen sind.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder