gpt4 book ai didi

python - 如何使用 psycopg2 将 scrapy 项目(或字典/命名元组)放入 postgres 存储过程(函数)中执行插入

转载 作者:行者123 更新时间:2023-11-29 12:27:50 27 4
gpt4 key购买 nike

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

我正在使用 scrapy 抓取数据并使用 item concept来自 scrapy,它有一个类似 python dict 的 api。我不想对存储过程签名/存储过程调用构造或插入语句中的所有字段进行参数化。

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

使用 pyscopg2 将类似 python dict 的实体放入 postgres 的最干净的方法是什么,而不必进行参数化,同时又是 future 的证明(即,没有位置参数化)。

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

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

我可以使用 Sql Adaption Protocol 吗?使用通用例程将 scrapy 项目子类化,将 scrapy 项目变成 postgres 复合类型?这会是明智的吗?

最佳答案

Postgres wiki 是这样说的:

A last item I would like to show you is how to insert multiple rows using a dictionary. If you had the following:

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

You could easily insert all three rows within the dictionary by using:

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)

关于python - 如何使用 psycopg2 将 scrapy 项目(或字典/命名元组)放入 postgres 存储过程(函数)中执行插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11470582/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com