Как использовать тип inet с Python и postgresql?

1

Я пишу программу python3, которая использует базу данных postgresql, я использую py-postgresql: http://python.projects.postgresql.org/ в качестве драйвера базы данных. В одной таблице хранятся IP-адреса с использованием типа inet.

Я создал следующий подготовленный оператор:

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

При вызове aID (ip) я получаю следующую ошибку:

(ip - строка питона)

 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

Может кто-нибудь помочь мне отладить это и выяснить, почему postgresql не нравится данные inet?

Спасибо!

Теги:
inet

3 ответа

1
Лучший ответ

@mrlanrat, потому что библиотека python отправляет ваши параметры в виде типа данных TEXT, но PostgreSQL ожидает тип данных INET. Ваш пример изменяет параметры так, чтобы PostgreSQL ожидал тип данных TEXT, который затем вписывается в тип данных INET. Я знаю, что psycopg2 поддерживает тип данных INET, но я уверен, что текущая версия py-postgresql не поддерживает тип данных (по состоянию на 2011-05-19). Это означает, что у вас есть три варианта:

  • py-postgresql необходимо добавить поддержку типа данных INET
  • вы можете передать данные типа TEXT, а затем передать его INET на сервер
  • переключиться на psycopg2, который поддерживает тип данных INET.

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

1

У меня была эта проблема весь день, и я не мог найти никакого решения, поэтому, очевидно, я нашел решение самостоятельно через несколько минут после публикации здесь.

Мне нужно заменить $1 на inet ($ 1:: varchar), кажется, что postgresql не нравится, что он является строкой при преобразовании в значение inet, и вы должны вывести его как varchar, а затем превратить значение в переменная inet.

Итак, рабочая строка:

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

Может кто-нибудь объяснить, почему это так, и почему это не работает так, как я пытался сначала?

Спасибо!

0

Вы должны явно ввести строку в тип данных inet.

aID = db.prepare('SELECT id FROM a_records WHERE ip = inet($1) LIMIT 1')
  • 1
    Я пытался это, не повезло, та же ошибка

Ещё вопросы

Сообщество Overcoder
Наверх
Меню