Wie bestimme ich die richtige `paramstyle`, wenn alles, was ich habe ein` Connection` Objekt ist?

StackOverflow https://stackoverflow.com/questions/1471304

  •  16-09-2019
  •  | 
  •  

Frage

Ich habe eine Instanz eines Connection (erforderlich DB API 2.0-kompatibel), aber ich habe nicht das Modul aus dem sie eingeführt wurden. Das Problem ist, dass ich versuche, benannte Parameter zu verwenden, aber ich weiß nicht, welche verwenden paramstyle zu.

Da paramstyle ein Modulebene konstant ist, kann ich nicht nur die Connection fragen. Ich habe versucht, mit inspect.getmodule() auf meinem Connection Beispiel, aber es None gerade zurückgekehrt . Gibt es einen einfacheren Weg, dass ich nur fehlt bin, oder ich brauche etwas try / except Code zu tun, um zu bestimmen, welche paramstyle zu benutzen?

War es hilfreich?

Lösung

Pass type(connection) (Verbindungsklasse) inspect.getmodule(), nicht Connection-Objekt. Die Klasse verfolgt das Modul, um es in so definiert wurde inspect es finden kann, während der Objekterstellung nicht nachgeführt wird.

Andere Tipps

Wo haben Sie die Instanz aus? Ich kann nicht eine Situation vorstellen, wo man nicht die vorher die Quelle der Verbindung wird es wissen. Wenn der Benutzer Ihrer Bibliothek ist eine Verbindung vorbei, fragen Sie ihn für die paramstyle auch.

Wie auch immer, sehen Sie die folgenden Konsolensitzung:

>>> import sqlite3
>>> c = sqlite3.connect('/tmp/test.db')
>>> c
<sqlite3.Connection object at 0xb7db2320>
>>> type(c)
<type 'sqlite3.Connection'>
>>> type(c).__module__
'sqlite3'
>>> import sys
>>> sys.modules[type(c).__module__].paramstyle
'qmark'

Doch das saugt. Ich würde nicht darauf verlassen, nicht einmal für eine Sekunde. Ich benutze meine eigene Verbindung ähnliche Objekte, und ich möchte einer von denen Ihrer Bibliothek zu übergeben. Ich würde es hassen, wenn es versucht, auf magische Weise die paramstyle, um herauszufinden, und nicht, weil ich eine Verbindung ähnlichen Wrapper-Objekt verwendet wird.

Sie können es nicht.

Sie können versuchen, auf connection.__class__.__module__ suchen, aber es ist nicht von der DB-API festgelegt, dass es funktionieren. In der Tat für viele gängige Fälle wird es nicht. (. ZB die Klasse in einem Submodul des Pakets definiert ist, der als das DB-API-Modul-Objekt wirkt;. Oder die Klasse C ist eine Erweiterung ohne __module__)

Es ist bedauerlich, aber Sie werden einen Verweis auf das DB-API-Modul Objekt um mit dem DB-API-Verbindung Objekt übergeben haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top