首页 > 编程问答 >如何在 Postgres 中存储嵌套列表?

如何在 Postgres 中存储嵌套列表?

时间:2024-07-20 21:35:47浏览次数:4  
标签:python postgresql nested-lists

如何以方便稍后在我的程序中使用嵌套列表的方式存储嵌套列表? Postgres 我计划将列表写入数据库一次并多次重复使用。 我已经能够将嵌套列表存储为 Python 但这不是最佳选择,我试图通过尽可能少的后处理来完成此任务,所以我宁愿做更多的前期工作以提高速度/轻松度在稍后检索时使用。

这些嵌套列表用于布局目的,而不是不良数据规范化。 string 这是我根据

此处

在我的数据库中创建的表进行的尝试具有支持 的字段(我正在使用 DBeaver,

的注释是 ARRAY 文本前的下划线 ARRAY : 尝试此操作时: _text 我收到错误:

CREATE TABLE public.layout (
    f_id int8 NULL,
    layout _text NULL
);

SQL 错误 [42703]: 错误: 列“list_1”不存在

insert into mpl_layout (f_id, layout)
values (7, ARRAY[["list_1"],["list_2"],["list_3"],["list_4"]]);

参数两边添加括号只会更改错误消息:

SQL 错误 [42601]: 错误: 语法错误或接近“7” ARRAY 我尝试了大括号

insert into mpl_layout (f_id, layout)
values (7, ARRAY([["list_1"],["list_2"],["list_3"],["list_4"]]));

格式:

并收到此错误: '{}' SQL错误[22P02]:错误:格式错误的数组文字: "{[["list_1"],["list_2"],["list_3"],["list_4"]]}" 详细信息:意外 数组元素。

insert into mpl_mosaic_layout (figure_id, layout)
values (7, '{[["list_1"],["list_2"],["list_3"],["list_4"]]}');

接下来我应该尝试什么?

SQL Error [22P02]: ERROR: malformed array literal: "{[["list_1"],["list_2"],["list_3"],["list_4"]]}" Detail: Unexpected array element.

What should I try next?


在 Postgres 中创建多维数组的方式几乎正确。问题在于尝试将字符串文字(例如,“list_1”)插入到应该包含数组的数组中。

以下是如何在 Postgres 中存储和检索嵌套列表(多维数组)的方法:

1. 表创建:

的表创建语句实际上是正确的。无需特殊字符或更改数据类型名称即可表示数组。以下内容有效:

CREATE TABLE public.layout (
    f_id int8 NULL,
    layout text[] NULL  --  这定义了一个文本数组
);

2. 插入数据:

使用适当的数组语法插入数据。在 Postgres 中,可以使用以下方法构建多维文本数组:

INSERT INTO public.layout (f_id, layout)
VALUES (7, '{{"list_1"}, {"list_2"}, {"list_3"}, {"list_4"}}'); 

在此语法中:

  • {{...}} 表示外部数组。
  • {...} 表示内部数组。
  • "list_1" 等是的字符串值。

3. 检索数据:

可以使用 SQL SELECT 语句以及数组索引检索数据:

SELECT layout[1][1] FROM public.layout WHERE f_id = 7; 

这将返回 list_1 ,因为数组索引从 1 开始。

使用 Python 的其他说明:

  • psycopg2: 如果使用 psycopg2 库,它可以自动处理 Python 列表和 Postgres 数组之间的转换。只需将 Python 列表作为参数传递给 SQL 查询即可, psycopg2 会处理剩下的事情。

```python import psycopg2

conn = psycopg2.connect("的连接字符串") cursor = conn.cursor()

layout = [["list_1"], ["list_2"], ["list_3"], ["list_4"]] cursor.execute("INSERT INTO public.layout (f_id, layout) VALUES (%s, %s)", (7, layout))

conn.commit() conn.close() ```

通过这种方法,可以在不手动格式化数组文字的情况下直接在 Postgres 中高效地存储和检索嵌套列表。

标签:python,postgresql,nested-lists
From: 78772897

相关文章

  • Python学习笔记41:游戏篇之外星人入侵(二)
    前言在上一篇文章,我们已经创建好了项目目录,在今天,我们主要编写入口模块的功能。mainmain.py模块是我们游戏程序的入口,所有我们需要在模块中编写游戏主启动以及主页面相关的代码。当前我们的main模块是这样的,这是我们创建项目时默认生成一些代码,接下来我们就要进行我们......
  • Python学习笔记39:进阶篇(二十八)pygame的使用之按键映射及按键失效问题解决
    前言基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。我们的下一步目标是完成pythoncrashcourse中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。私信我发送消息python资料,......
  • Python学习笔记40:游戏篇之外星人入侵(一)
    前言入门知识已经学完,常用标准库也了解了,pygame入门知识也学了,那么开始尝试小游戏的开发。当然这个小游戏属于比较简单的小游戏,复杂的游戏需要长时间的编写累计开发经验,同时也需要一定的时间才能编写出来。现在的话还是嫩了点。从基础的简单的开始,学习实践,慢慢的成长才......
  • Python学习笔记37:进阶篇(二十六)pygame的使用之输入处理
    前言基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。我们的下一步目标是完成pythoncrashcourse中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。私信我发送消息python资料,......
  • Python学习笔记38:进阶篇(二十七)pygame的使用之时间与帧数控制
    前言基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。我们的下一步目标是完成pythoncrashcourse中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。私信我发送消息python资料,......
  • 音频文件降噪及python示例
    操作系统:Windows10_x64Python版本:3.9.2noisereduce版本:3.0.2从事音频相关工作,大概率会碰到降噪问题,今天整理下之前学习音频文件降噪的笔记,并提供Audacity和python示例。我将从以下几个方面展开:noisereduce库介绍使用Audacity进行降噪使用fft滤波降噪使用noisereduce进......
  • Python; Django 添加字符到路径名导致操作系统错误 22
    我一直在尝试让django渲染我创建的模板。起初它说模板不存在,但是一旦我修复了错误,它现在就会向路径添加字符,并且因此找不到模板。路径应该是:C:\\Users\\ABC\\Desktop\\science_crowd\\Lightweight_Django\\placeholder\\home.html但是错误说:它找不到:C:\\Us......
  • 如何在 IPython 控制台中显示 conda 环境名称?
    上下文我想在Spyder的IPython控制台中显示conda环境名称,这样我就知道我正在运行哪个环境。虽然此信息在状态栏中可用,但有时只是显示|||而不是实际的环境名称:conda我尝试过的在启动时打印它Spyder允许在控制台启动时运行代码。但是,似乎......
  • Python 中更快的套接字
    我有一个用Python编写的服务器客户端,它通过LAN运行。该算法的某些部分密集使用套接字读取,其执行速度比用C++编写的几乎相同的慢3-6倍。有哪些解决方案可以使Python套接字读取速度更快?我实现了一些简单的缓冲,我的用于处理套接字的类如下所示:P.S.:分析还显示......
  • .py文件是python脚本吗
    .py文件是python的脚本文件。Python在执行时,首先会将.py文件中的源代码编译成Python的bytecode(字节码),然后再由PythonVirtualMachine(Python虚拟机)来执行这些编译好的bytecode。这种机制的基本思想跟Java,.NET是一致的。然而,PythonVirtualMachine与Java或.NET的Virtual......