Alternativen zu pymssql

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

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:

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

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: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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

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