2011-05-17 53 views
1

我在寫一個使用postgresql數據庫的python3程序,我使用py-postgresql:http://python.projects.postgresql.org/作爲數據庫驅動程序。 一個表使用inet類型存儲IP地址。如何在Python和postgresql中使用inet類型?

我創建了以下準備好的聲明:

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數據?

謝謝!

回答

1

@mrlanrat,這是因爲python庫將您的參數作爲TEXT數據類型發送,但PostgreSQL期待INET數據類型。你的例子改變了參數,以便PostgreSQL期待一個TEXT數據類型,然後將它轉換爲一個INET數據類型。我知道psycopg2支持INET數據類型,但我很確定當前版本的py-postgresql不支持數據類型(截至2011年5月19日)。這意味着你有三種選擇:

  1. PY-PostgreSQL的需要,增加了對INET數據類型
  2. 你在類型TEXT的數據傳遞,然後將它轉換到INET服務器
  3. 交換機上的支持到psycopg2,它支持INET數據類型。

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

0

您應該明確地將字符串轉換爲inet數據類型。

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

我試過了,沒有運氣,同樣的錯誤。 – lanrat 2011-05-17 05:11:50

1

我已經整天有這個問題,我找不到任何解決方案,所以很明顯,我發現我自己幾分鐘的解決方案張貼在這裏了。

我需要用inet($ 1 :: varchar)替換$ 1,看起來postgresql在轉換爲inet值時不喜歡它是一個字符串,並且您必須將它作爲varchar進行類型轉換,然後將該值變成一個inet變量。

因此,工作線路:

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

誰能解釋這是爲什麼,爲什麼它不會工作,我想在第一次的方式嗎?

謝謝!

相關問題