在python中插入PostgreSQL数据库而不知道变量的数量

在python中插入PostgreSQL数据库而不知道变量的数量,python,database,postgresql,Python,Database,Postgresql,本质上,我使用python库查询单词的同义词,然后将该单词及其同义词添加到postgreSQL表中。如果某些表列为空就可以了,但我不知道如何将同义词插入数据库,因为我不知道会有多少 例如,我有一个6列的表格,1列代表原始单词,5列代表同义词。对于一个单词,我可能得到3个同义词,但对于其他单词,我可能得到全部5个同义词 我成功编程此任务的唯一方法是一组可怕的if语句: for word in textlist: syns = dictionary.synonym(word) num = len(s

本质上,我使用python库查询单词的同义词,然后将该单词及其同义词添加到postgreSQL表中。如果某些表列为空就可以了,但我不知道如何将同义词插入数据库,因为我不知道会有多少

例如,我有一个6列的表格,1列代表原始单词,5列代表同义词。对于一个单词,我可能得到3个同义词,但对于其他单词,我可能得到全部5个同义词

我成功编程此任务的唯一方法是一组可怕的if语句:

for word in textlist:
syns = dictionary.synonym(word)
num = len(syns)

if len(syns) == 5:
    for i in syns:
        syn1 = i[0]
        syn2 = i[1]
        syn3 = i[2]
        syn4 = i[3]
        syn5 = i[4]
等等。。。然后使用这些变量将同义词插入数据库表

我想到的一种方法是建立另一个单词和同义词列表,并循环通过该列表添加到表中。但我不知道该怎么做。任何关于如何进一步推动的帮助都将是巨大的帮助。多谢各位

注意:syns返回一个列表对象

编辑:

多亏了@systemjack,我改变了系统,使其有3个表列。id(这是一个串行主键)、word和synos(最初是syn,但为了确保它不是某个奇怪的关键字而进行了更改)。每个单词应与一个同义词一起添加到一行中,然后下一行可以是具有不同同义词的同一单词,依此类推……无论如何,新方法如下所示:

for word in textlist:
    syns = dictionary.synonym(word)
    if syns is not None:
        for syn in syns:
            cursor.execute('INSERT INTO wordsyn (word, "synos") VALUES (%s, %s);', (word, syn))
然而,我现在得到了错误
psycopg2.ProgrammingError:关系“wordsyn”的“synos”列不存在第1行:插入wordsyn(word,“synos”)值('&c

我在synos周围加了双引号,试图让它工作,但没有它们也不行。任何进一步的帮助都将不胜感激

\d+wordsyn输出:


最终编辑:发现问题。没有将表放在正确的数据库中。我以为\dt只显示当前数据库中的表,但显然没有。典型的关系方法是将其设置为一个两列的表,其中包含一个单词列和第二个同义词列。然后,每个单词同义词组合都有一行

在这种情况下,使用数据的查询要简单得多。您真的不想处理数量可变的填充列。此外,如果一个单词有6个同义词,会发生什么情况

最简单的实现要求每个字有多个插入,但这并不是什么大问题。还有

如果你真的希望每个单词有一行,你可以使用and的组合来在一列中存储可变数量的值

您还可以管理更复杂的动态系统

请记住,最后两种方法都要慢得多

使用第一种方法时,插入的内容类似于:

for word in textlist:
    syns = dictionary.synonym(word)
    for syn in syns:
        cursor.execute('insert into syns (word, syn) values (%s, %s);', (word, syn))
select word, string_agg(syn, ', ') 
from syns where word='perspicuitous'
group by word;
然后,如果您想查看一个单词的所有同义词,可以执行以下操作:

for word in textlist:
    syns = dictionary.synonym(word)
    for syn in syns:
        cursor.execute('insert into syns (word, syn) values (%s, %s);', (word, syn))
select word, string_agg(syn, ', ') 
from syns where word='perspicuitous'
group by word;

一种方法是创建两个表,一个用于word,另一个用于同义词,如下所示

Word:

id  - primary key - could be autogenerated.
word - sring - To store the word

Synoym:

id -- primary key - could be autogenerated.
word_id --  Foreign key to Word table id
synonym --  String - The synonym 
对于每个单词,如果单词存在,则在单词表中查找,如果不插入,则只获取现有条目的id。 使用字典获取单词的同义词。同义词(word)。对于每个同义词,请从上面查找带有单词id的同义词表和同义词,如果不存在,请插入,否则请转到下一个同义词

对所有单词重复这个

选择单词的同义词将变成如下查询:

select syn.synonym from synonym syn , word wd 
where wd.id = syn.word_id and wd.word = 'foo'

如果有可能更改您的数据库结构,那么我们可以很容易地找到一个合适的解决方案。这是一个选项吗?@gipsy可能是的。我没有以任何方式对其进行专门的映射。但这在某种程度上取决于您的建议。如果您为生成的表提供一个示例用例,它将有助于找出最佳模式。如果您e使用psql你会添加
\d+wordsyn
的输出吗?我被难住了。我觉得一切都很好。使用psql手动插入有用吗?比如:
插入wordsyn(word,synos)值('foo','bar'))
我想你说col1是单词,col2是该单词的一个syn,必要时一个单词有多行。但是col1不能是主键。是的。更正。谢谢。@systemjack谢谢你的回复。这看起来会很好用。我试过后会回复你。@systemjack好的,所以我认为这会有用。我创建了一个表h 3列(称为wordsyn),其中一列是自动生成的id(我稍后需要它),另外两列如您所说,一列用于单词-called word-和同义词-called syn。我的代码遵循您的示例,但我得到了错误
psycopg2。编程错误:关系“wordsyn”的列“syn”不存在
我不确定这可能是什么,因为这肯定是列的名称。如果您从wordsyn limit 1;中选择单词“syn”,它是否工作?如果不工作,请尝试从wordsyn limit 1;中选择*并检查标题是什么。