Como faço para determinar o `paramstyle` adequada quando tudo o que tenho é um objeto` Connection`?

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

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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top