2

我正在为数据库创建服务层,因此我正在创建函数来执行某些操作。其中一些是简单的异步插入。但是,它们有大量的参数。

我正在使用scrapy来蜘蛛数据,我使用scrapy的item概念,它有一个类似于python dict的api。我不想参数化存储过程签名/存储过程调用构造或插入语句中的所有字段。

请注意,复合类型在开始时被声明了两次。第一个create table在 postgres 的语句中,第二个在 scrapy 中使用 item 接口。所以 :

什么是使用 pyscopg2 将类似 dict 的实体放入 postgres 的最简洁方法,而无需进行参数化,同时又是未来的证明(即,没有位置参数化)。

我在想tablename%ROWTYPE应该声明为存储过程输入参数,但是当我创建执行查询字符串时,如何映射类似 python 的对象?我认为与psycopg2 中的复合类型外壳有关。但是我无法从文档中看到完整的图片。

为了争论,让我们考虑一个CREATE TABLE( name character varying, id integer primary key)具有相应scrapy类型的用户表,并且主ID在域中隐式地唯一。任何关于插入如何看起来像默认值和 pkey 序列化程序的评论也将有所帮助:D

我可以使用Sql Adaption Protocol使用通用例程对 scrapy 项目进行子类化,以将 scrapy 项目转换为 postgres 复合类型吗?这会是明智的吗?

4

1 回答 1

0

Postgres wiki 有这样的说法:

我想向您展示的最后一项是如何使用字典插入多行。如果您有以下情况:

namedict = ({"first_name":"Joshua", "last_name":"Drake"},
            {"first_name":"Steven", "last_name":"Foo"},
            {"first_name":"David", "last_name":"Bar"})

您可以使用以下方法轻松地在字典中插入所有三行:

cur = conn.cursor()
cur.executemany("""INSERT INTO bar(first_name,last_name) VALUES (%(first_name)s, %(last_name)s)""", namedict)

hstore 模块具有创建结构化行类型的功能:

CREATE TABLE test (col1 integer, col2 text, col3 text);

SELECT * FROM populate_record(null::test,
                              '"col1"=>"456", "col2"=>"zzz"');
 col1 | col2 | col3 
------+------+------
  456 | zzz  | 
(1 row) 
于 2012-07-14T15:29:43.123 回答