Come faccio a determinare il corretto `paramstyle` quando tutto quello che ho è un oggetto` Connection`?

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

  •  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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top