Come faccio a determinare il corretto `paramstyle` quando tutto quello che ho è un oggetto` Connection`?
-
16-09-2019 - |
Domanda
Ho un'istanza di un Connection
(necessario per DB API 2.0-compliant), ma non ho il modulo da cui è stato importato. Il problema è che sto cercando di utilizzare i parametri denominati, ma non so che paramstyle
da usare.
Dal momento che è un paramstyle
a livello di modulo costante, non posso basta chiedere al Connection
. Ho provato ad utilizzare inspect.getmodule()
sul mio esempio Connection
, ma appena tornato None
. C'è un modo più semplice che mi manca solo, o avrò bisogno di fare un po 'di codice try
/ except
per determinare quale paramstyle
da usare?
Soluzione
Passo type(connection)
(classe di connessione) per inspect.getmodule()
, non oggetto di connessione. La classe tiene traccia del modulo è stata definita in modo da inspect
possa trovarlo, mentre la creazione di oggetti non è monitorata.
Altri suggerimenti
Dove hai preso l'istanza da? Non riesco a immaginare una situazione in cui non si sa l'anticipo della sorgente della connessione. Se l'utente della tua libreria che si sta passando una connessione, chiedere a lui per il paramstyle pure.
In ogni caso, guardare il seguente sessione della console:
>>> 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'
Tuttavia che fa schifo. Non vorrei contare su di essa nemmeno per un secondo. Io uso i miei oggetti di connessione simile, e mi piacerebbe passare una di quelle alla libreria. Mi dispiacerebbe che quando si cerca di trovare magicamente il paramstyle e non riesce perché sto usando un oggetto wrapper di connessione simile.
Non è possibile.
Si può provare, cercando in connection.__class__.__module__
, ma non è specificato da DB-API che funzionerà. In effetti, per molti casi comuni non lo farà. (Es. La classe è definita in un modulo del pacchetto che agisce come oggetto modulo DB-API,. O la classe è un'estensione C senza __module__
)
E 'un peccato, ma si dovrà passare un riferimento all'oggetto del modulo DB-API in giro con l'oggetto di connessione DB-API.