2016-07-25 93 views
0

我有一個表:如何通過OID參數PostgreSQL函數

CREATE TABLE public."Persons" 
(
    id_persons serial NOT NULL, 
    name_persons varchar(50) NOT NULL, 
    telephone_persons varchar(14) NOT NULL, 
    email_persons varchar(100), 
    address_persons integer NOT NULL, 
    photo_persons oid, 
    login_persons varchar(20) NOT NULL, 
    password_persons varchar(32) NOT NULL, 
    type_persons public."PersonTypes" NOT NULL DEFAULT 'Client', 
    CONSTRAINT "Persons_pkey" PRIMARY KEY (id_persons), 
    CONSTRAINT "Persons-email_ukey" UNIQUE (email_persons), 
    CONSTRAINT "Persons-login_ukey" UNIQUE (login_persons) 
); 

在本地PC我有一個photo.gif文件,我需要這個文件中Person表發送到photo_persons列。

我想通過存儲過程並使用cursor.callproc() psycopg2方法來執行此操作。

我需要一些存儲過程和psycopg2示例來獲取此示例。

回答

1

您需要通過的oid是大對象本身的oid,而不是函數。

假設一些連接對象conn

conn = psycopg2.connect(...) 

大型物體可以被創建並在幾個方面填充,如:

# Open for writing in binary mode. No oid is passed, so a new object 
# will be created. 
new_lob = conn.lobject(mode="wb") 

# Stash the newly allocated oid. 
new_oid = new_lob.oid 

# Put some data in the object. 
new_lob.write(b"some data") 

# And close it out. 
new_lob.close() 

另外,從文件創建和填充一個大對象在代碼運行的地方,你可以這樣做:

# Open for writing in binary mode. No oid is passed, so a new object 
# will be created. psycopg2 will take care of loading the contents 
# of the file named "somefile.ext". 
new_lob = conn.lobject(mode="wb", new_file="somefile.ext") 

# Stash the newly allocated oid. 
new_oid = new_lob.oid 

# And close it out. 
new_lob.close() 

爲了從先前創建的大的物體加載數據,通過在oidlobject,例如:

# Open the object identified by new_oid in binary reading mode. 
loaded_lob = conn.lobject(oid=new_oid, mode="rb") 

# Load all of its data. 
loaded_lob.read() == b"some data" 

如果使用第二種方法來創建對象,通過傳遞的文件名,即,可以再傳給生成的oid到您的函數,然後將該標識符存儲在您的表中。並且請注意,您可能希望在同一個事務中執行這兩個步驟 - 創建大對象並創建表條目。

+0

但我有一個postgresql存儲過程,用於保存數據在一個名爲'Person'的表中。這個函數預計會接收很多參數,其中一個是一個叫做'photo'的oid類型。 當我使用cursor.callproc()調用存儲過程時,必須傳遞給'photo'參數嗎? 這將是一個'lobject'對象?例如。 'cur.callproc(par1,par2,....,any_lobject)'? –

+0

如果'photo'參數應該是現有'lobject'的'oid',那麼你就像上面的例子那樣通過'oid',例如, 'new_lob.oid'。 – yieldsfalsehood

+0

在這種情況下,二進制文件必須預先存儲在數據庫中,它是正確的? 但在我的情況下,圖像文件在本地PC上,需要通過存儲過程發送到數據庫。 –