2009-09-17 38 views
1

我使用PyGreSQL来访问我的数据库。在我目前正在使用的用例中,我试图插入一条记录表中并返回最后ROWID ...又名的DB我的ID字段所创造的价值:pygresql - 插入并返回串行

create table job_runners (
    id   SERIAL PRIMARY KEY, 
    hostname  varchar(100) not null, 
    is_available boolean default FALSE 
    ); 

sql = "insert into job_runners (hostname) values ('localhost')" 

当我使用的db.insert(),这使得最有意义的是,我收到了一个“AttributeError”。当我尝试db.query(sql)时,我什么也得不到,只有一个OID。

问:使用PyGreSQL什么是插入记录,并没有做任何额外的读取或查询返回的ID字段的值的最佳方式?

+0

请提供更多信息:db.insert()/ db.query()的实际调用,确切的错误消息,Postgres和PyGreSQL的版本等。 – 2009-09-17 12:10:44

回答

0

在PyGreSQL文档说,如果你调用dbconn.query()与和插入/更新语句,这将返回OID。当涉及多个行时,它继续说出一些关于OID列表的内容。

首先的;我发现OID功能不起作用。我想知道库和工具的版本号会有所帮助,但是,我并没有试图返回OID。

最后;通过将“返回ID”,由@hacker的建议,pygresql只是做了正确的事情,(见下面的代码)返回记录集与生成的字典中的ID。

sql = "insert into job_runners (hostname) values ('localhost') returning id" 
rv = dbconn.query(sql) 
id = rv.dictresult()[0]['id'] 
+0

我认为你的示例代码缺少'RETURNING'位;-) – 2009-09-17 17:11:05

1
INSERT INTO job_runners 
    (hostname,is_available) VALUES ('localhost',true) 
    RETURNING id 

这就是说,我不知道pygresql的想法,但你所编写的程序,我想这是要在这里使用db.query()

+0

@hacker - 虽然上面的SQL帮助我明确指出了问题使用pygresql并从数据库中获取该ID。 – Richard 2009-09-17 16:45:05

+0

从数据库获取ID是在'RETURNING'部分。我假设你知道如何获得'db.query()'产生的结果。没有这一点,它不会把生成的id传回客户端。 – 2009-09-17 17:05:54

+0

刚刚看了你自己的答案,你自己的问题;-)的OID的事情是不是很好的办法,因为你并不总是有OID,我不认为'INSERT'是有史以来返回多个OID做(但我不确定,因为我从来没有使用它),最后你仍然必须从OID中推断'id'。那么''''''''currval('job_runners_id_seq')'会更容易做到。 – 2009-09-17 17:10:30

0

假设你有一个光标对象cur

cur.execute("INSERT INTO job_runners (hostname) VALUES (%(hostname)s) RETURNING id", 
      {'hostname': 'localhost'}) 
id = cur.fetchone()[0] 

这确保正确PyGreSQL逸出的输入字符串,以防止SQL注入。