Pergunta

Eu estou escrevendo um python3 programa que usa um banco de dados postgresql, eu estou usando py-postgresql: http://python.projects.postgresql.org/ como o driver de banco de dados.Uma tabela armazena endereços IP usando o inet tipo.

Eu criei a seguinte instrução preparada:

aID = db.prepare('SELECT id FROM a_records WHERE ip = $1 LIMIT 1')

Ao chamar ajuda(ip) recebo o seguinte erro:

(o ip é um python string)

 File "/usr/local/lib/python3.1/dist-packages/postgresql/driver/pq3.py", line
1517, in __call__
    c = SingleXactFetch(self, parameters)
  File "/usr/local/lib/python3.1/dist-packages/postgresql/driver/pq3.py", line
837, in __init__
    Output.__init__(self, '')
  File "/usr/local/lib/python3.1/dist-packages/postgresql/driver/pq3.py", line
622, in __init__
    self._init()
  File "/usr/local/lib/python3.1/dist-packages/postgresql/driver/pq3.py", line
854, in _init
    STEP()
  File "/usr/local/lib/python3.1/dist-packages/postgresql/driver/pq3.py", line
2612, in _pq_step
    self.typio.raise_error(x.error_message, cause = getattr(x, 'exception', Non
e))
  File "/usr/local/lib/python3.1/dist-packages/postgresql/driver/pq3.py", line
507, in raise_error
    self.raise_server_error(error_message, **kw)
  File "/usr/local/lib/python3.1/dist-packages/postgresql/driver/pq3.py", line
498, in raise_server_error
    raise server_error
postgresql.exceptions.BinaryRepresentationError: invalid address family in exte
rnal "inet" value
  CODE: 22P03
  LOCATION: File 'network.c', line 218, in network_recv from SERVER
RESULT:
  type: SingleXactFetch
  parameters: ('139.78.113.1',)
STATEMENT: [prepared]
  sql_parameter_types: ['pg_catalog.inet']
  results: (id INTEGER)
  statement_id: py:0x2ff9a50
  string: SELECT id FROM a_records WHERE ip = $1 LIMIT 1
CONNECTION: [idle]
  client_address: 127.0.0.1/32
  client_port: 51563
  version:
    PostgreSQL 8.4.7 on x86_64-pc-linux-gnu, compiled by GCC gcc-4.4.real (Debi
an 4.4.5-8) 4.4.5, 64-bit
CONNECTOR: [IP4] pq://python:***@127.0.0.1:5432/vdz
  category: None
DRIVER: postgresql.driver.pq3.Driver

Alguém pode me ajudar a depurar e descobrir por que o postgresql não está gostando do inet de dados?

Obrigado!

Foi útil?

Solução

@mrlanrat, é porque a biblioteca em python é o envio de seus parâmetros como tipo de dados de TEXTO, mas o PostgreSQL está esperando um INET tipo de dados.O seu exemplo não altera os parâmetros para que o PostgreSQL está esperando um tipo de dados de TEXTO, que, em seguida, lança-se a um INET tipo de dados.Eu sei que psycopg2 suporta uma INET tipo de dados, mas eu tenho certeza que a versão atual do py-postgresql não suporta o tipo de dados (como de 2011-05-19).O que significa que você tem três opções:

  1. py-postgresql precisa adicionar suporte para o INET tipo de dados
  2. você começa a passar os dados do tipo TEXTO e, em seguida, lançá-lo para INET no servidor
  3. mudar para psycopg2, que suporta o INET tipo de dados.

http://initd.org/psycopg/docs/extras.html#inet-data-type

Outras dicas

Eu tenho tido esse problema todos os dias, e eu não poderia encontrar qualquer solução, então, obviamente, eu encontrei a solução no meu próprio poucos minutos depois de postar aqui.

Eu preciso substituir $1 com inet($1::varchar), parece que o postgresql não como sendo uma seqüência de caracteres, quando da conversão para um inet valor, e você tem typecast é como um varchar, e, em seguida, transformar o valor em um inet variável.

Assim, o trabalho de linha é:

aID = db.prepare('SELECT id FROM a_records WHERE ip = inet($1::varchar) LIMIT 1')

Alguém pode explicar por que isso é, e porque isso não vai funcionar da maneira que eu tentei primeiro?

Obrigado!

Você deve usar explicitamente seqüência de caracteres para inet tipo de dados.

aID = db.prepare('SELECT id FROM a_records WHERE ip = inet($1) LIMIT 1')
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top