2016-07-25 179 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上,需要通过存储过程发送到数据库。 –