Como faço para determinar o `paramstyle` adequada quando tudo o que tenho é um objeto` Connection`?
-
16-09-2019 - |
Pergunta
Eu tenho uma instância de uma Connection
(necessário para DB API 2.0 compatível), mas eu não tenho o módulo a partir do qual ele foi importado. O problema é que eu estou tentando usar parâmetros nomeados, mas eu não sei qual paramstyle
para uso.
Desde paramstyle
é uma constante de nível de módulo, eu não posso simplesmente pedir ao Connection
. Eu tentei usar inspect.getmodule()
no meu exemplo Connection
, mas ele só voltou None
. Existe uma maneira mais fácil que eu estou em falta, ou eu preciso fazer algum código try
/ except
para determinar qual paramstyle
de usar?
Solução
Passe type(connection)
(classe de conexão) para inspect.getmodule()
, não connection object. A classe acompanha o módulo foi definido em modo inspect
pode encontrá-lo, enquanto a criação do objeto não é controlado.
Outras dicas
Onde você conseguiu a instância de? Eu não posso imaginar uma situação onde você não vai saber o previamente a origem da conexão. Se o usuário de sua biblioteca está passando uma ligação, pedir-lhe para o paramstyle também.
De qualquer forma, olhar para a sessão seguinte 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'
No entanto, que é uma porcaria. Eu não iria contar com ele nem mesmo por um segundo. Eu uso minha própria conexão de como objetos, e eu gostaria de passar um daqueles à sua biblioteca. Eu odeio quando ele tenta encontrar magicamente o paramstyle e não porque eu estou usando uma conexão do tipo objeto de invólucro.
Você não pode.
Você pode tentar olhando connection.__class__.__module__
, mas não é especificado pela DB-API que ele vai trabalhar. De fato, para muitos casos comuns não vai. (Por exemplo, a classe é definida em um sub-módulo do pacote que actua como o objecto de módulo de DB-API;.. Ou a classe é uma extensão C sem __module__
)
É lamentável, mas você terá que passar uma referência para o objeto módulo DB-API ao redor com o objeto de conexão DB-API.