¿Cómo se determina el correcto `paramstyle` cuando todo lo que tengo es un objeto` Connection`?

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

  •  16-09-2019
  •  | 
  •  

Pregunta

I tiene una instancia de un Connection (necesario para DB API 2.0 compatible), pero no tengo el módulo de la que fue importada. El problema es que estoy tratando de utilizar parámetros con nombre, pero no sé lo que paramstyle a utilizar.

Desde paramstyle es un nivel de módulo constante, no puedo simplemente pido al Connection. He intentado utilizar inspect.getmodule() en mi ejemplo Connection, pero acabo de volver None . ¿Hay una manera más fácil que estoy solo falta, o voy a tener que hacer algo de código try / except para determinar qué paramstyle usar?

¿Fue útil?

Solución

Pass type(connection) (clase de conexión) a inspect.getmodule(), no objeto de conexión. La clase sigue el módulo se define en la inspect lo encuentra, mientras que la creación de objetos no se realiza un seguimiento.

Otros consejos

¿Dónde consiguió la instancia de? No me puedo imaginar una situación en la que no se sabe de antemano el del origen de la conexión. Si el usuario de la biblioteca que está pasando una conexión, solicite información sobre el paramstyle también.

De todos modos, mira el siguiente sesión de consola:

>>> 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'

Sin embargo eso apesta. Yo no confiar en ella ni siquiera por un segundo. Yo uso mis propios objetos de conexión similar, y me gustaría pasar una de las personas a su biblioteca. No me gustaría que cuando se trata de encontrar mágicamente la paramstyle y falla porque estoy usando un objeto envoltorio conexión similar.

No se puede.

Puede intentar examinado connection.__class__.__module__, pero no es especificado por DB-API que se va a trabajar. De hecho, para muchos casos comunes que no lo hará. (. Por ejemplo, la clase se define en un submódulo del paquete que actúa como el objeto de módulo DB-API;. O la clase es una extensión C sin __module__)

Es lamentable, pero que tendrá que pasar una referencia al objeto módulo DB-API por ahí con el objeto de conexión DB-API.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top