代码之家  ›  专栏  ›  技术社区  ›  Richard

pygresql-插入并返回序列号

  •  1
  • Richard  · 技术社区  · 15 年前

    我正在使用 PyGreSQL 访问我的数据库。在我目前正在处理的用例中;我正在尝试向表中插入一条记录并返回最后一个rowid。。。aka DB为“我的ID”字段创建的值:

    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字段值的最佳方法是什么,而不需要进行任何额外的读取或查询?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Michael Krelin - hacker    15 年前
    INSERT INTO job_runners
        (hostname,is_available) VALUES ('localhost',true)
        RETURNING id
    

    也就是说,我不知道pygresql,但根据您已经编写的内容,我猜它是 db.query()

        2
  •  1
  •   Richard    15 年前

    PyGreSQL中的文档说明,如果使用insert/update语句调用dbconn.query(),它将返回OID。它接着讲述了当涉及多行时OID的列表。

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

    最后通过添加@hacker建议的“returning id”,pygresql做了正确的事情,并在结果字典中返回了一个带有id的记录集(见下面的代码)。

    sql = "insert into job_runners (hostname) values ('localhost') returning id"
    rv = dbconn.query(sql)
    id = rv.dictresult()[0]['id']
    
        3
  •  0
  •   Rezzie    15 年前

    假设您有一个游标对象 cur

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

    这确保PyGreSQL正确地转义输入字符串,从而防止SQL注入。