1

私はpostgresqlデータベースを使用するpython3プログラムを書いています、私はデータベースドライバーとしてpy-postgresql: http ://python.projects.postgresql.org/を使用しています。1つのテーブルには、inetタイプを使用してIPアドレスが格納されます。

次のプリペアドステートメントを作成しました。

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

aID(ip)を呼び出すと、次のエラーが発生します。

(ipはPython文字列です)

 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データを好まない理由を理解するのを手伝ってもらえますか?

ありがとう!

4

3 に答える 3

1

私は一日中この問題を抱えていて、解決策を見つけることができなかったので、ここに投稿してから数分後に自分で解決策を見つけたのは明らかです。

$ 1をinet($ 1 :: varchar)に置き換える必要があります。postgresqlはinet値に変換するときに文字列であることが気に入らないようです。そのため、varcharとして型キャストしてから、値をinet変数に変換する必要があります。 。

したがって、作業ラインは次のとおりです。

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

これがなぜであるのか、そしてなぜそれが私が最初に試みたように機能しないのかを誰かが説明できますか?

ありがとう!

于 2011-05-17T05:17:04.000 に答える
1

@mrlanrat、PythonライブラリがパラメータをTEXTデータ型として送信しているのに、PostgreSQLはINETデータ型を想定しているためです。ここでの例では、PostgreSQLがTEXTデータ型を予期するようにパラメーターを変更し、それをINETデータ型にキャストします。psycopg2がINETデータ型をサポートしていることは知っていますが、現在のバージョンのpy-postgresqlはデータ型をサポートしていないと確信しています(2011-05-19現在)。つまり、次の3つのオプションがあります。

  1. py-postgresqlは、INETデータ型のサポートを追加する必要があります
  2. タイプTEXTのデータを渡して、サーバー上のINETにキャストします。
  3. INETデータ型をサポートするpsycopg2に切り替えます。

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

于 2011-05-19T17:52:49.527 に答える
0

文字列を明示的にinetデータ型にキャストする必要があります。

aID = db.prepare('SELECT id FROM a_records WHERE ip = inet($1) LIMIT 1')
于 2011-05-17T05:07:45.490 に答える