Seite 1 von 1

Alternativen zu pymssql

Verfasst: Montag 18. Juni 2007, 12:58
von febel
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

Verfasst: Montag 18. Juni 2007, 14:12
von Sr4l
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 :-)

Verfasst: Montag 18. Juni 2007, 14:23
von rafael
Soll es denn weiterhin ein MS SQL Server sein? Ansonsten empfehle ich SQLAlchemy, was für MS SQL pyodbc , adodbapi und pymssql unterstützt.

Re: Alternativen zu pymssql

Verfasst: Montag 18. Juni 2007, 14:49
von gerold
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
:-)

Verfasst: Montag 18. Juni 2007, 17:25
von Y0Gi
SQLAlchemy und SQLObject sind Abstraktionsschichten für den Datenbankzugriff, die aber ihrerseits auf ein entsprechendes Connector-Paket zur verwendeten Datenbank angewiesen sind.