我正在构建一个使用multer接受文件上传的API服务器。
我需要将所有为每个请求上传的所有文件的所有路径的数组存储到我已连接到服务器的PostgreSQL数据库的一列中。
说我有一个用以下查询创建的表
CREATE TABLE IF NOT EXISTS records
(
id SERIAL PRIMARY KEY,
created_on TIMESTAMPTZ NOT NULL DEFAULT NOW(),
created_by INTEGER,
title VARCHAR NOT NULL,
type VARCHAR NOT NULL
)
如何在上表中定义新列filepaths
,我可以在其中插入JavaScript字符串数组(例如:['path-to-file-1', 'path-to-file-2', 'path-to-file-3']
)。
我还如何使用node-postgres
答案 0 :(得分:0)
您有2个选择:
使用json
或jsonb
类型。在这种情况下,要插入的字符串将如下所示:
'["path-to-file-1", "path-to-file-2", "path-to-file-3"]'
我更喜欢jsonb
-它允许具有良好的索引。 Json只是带有一些附加内置功能的文本。
使用文本数组-类似于filepaths text[]
。要插入,您可以使用:
ARRAY ['path-to-file-1', 'path-to-file-2', 'path-to-file-3']
或
'{path-to-file-1,path-to-file-2,path-to-file-3,"path to file 4"}'
您只需要在此处包含空格等的元素时使用“。但是您也可以随意填充以将其用于所有元素。
答案 1 :(得分:0)
您可以创建一个file
表,该表具有一个路径列和对该表所属记录的外键引用。这样,您可以将路径仅存储为文本列,而不是将数组存储在列中,这对于关系数据库是更好的做法。如果以后需要,您还可以在文件上存储其他信息。与文件路径记录进行交互会更简单,因为您只需通过在file
表中插入新行(使用适当的外键)来添加新文件路径,然后通过删除行来删除文件file
表中。
例如:
CREATE TABLE IF NOT EXISTS file (
record_id integer NOT NULL REFERENCES records(id) ON DELETE CASCADE,
path text NOT NULL
);
然后要获取记录的所有文件,可以将两个表连接在一起,并根据需要转换为数组。
例如:
SELECT
records.*,
ARRAY (
SELECT
file.path
FROM
file
WHERE
records.id = file.record_id
) AS file_paths
FROM
records;
样本输入(仅使用记录的标题字段):
INSERT INTO records (title) VALUES ('A'), ('B'), ('C');
INSERT INTO file (record_id, path) VALUES (1, 'patha1'), (1, 'patha2'), (1, 'patha3'), (2, 'pathb1');
示例输出:
id | title | file_paths
----+-------+------------------------
1 | A | {patha1,patha2,patha3}
2 | B | {pathb1}
3 | C | {}