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

时间:2017-03-03 01:43:44

标签: python database postgresql

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

E.g我有一个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(这是一个串行主键),单词和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: column "synos" of relation "wordsyn" does not exist LINE 1: INSERT INTO wordsyn (word, "synos") VALUES ('&c

我已经在synos周围放了双引号以试图让它工作,但是如果没有它们它也无法工作。任何进一步的帮助将不胜感激。

\ d + wordsyn输出:

\d+ wordsyn creates outputs:

最终编辑:发现问题。没有正确的数据库中的表。我以为\ dt只显示当前数据库中的表,但显然不是。

2 个答案:

答案 0 :(得分:3)

典型的关系方法会将其设置为带有字列和第二个同义词列的两列表。然后,每个单词 - 同义词组合都有一行。

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

最简单的实现需要每个单词多次插入,但这并不是什么大问题。还有ways to batch up the inserts

如果您确实希望每个单词有一行,则可以使用SPLIT_PARTSTRING_AGG的组合在一列中存储可变数量的值。我强烈建议采用前一种方法。

您还可以管理更复杂的动态structures as JSON

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

使用第一种方法,您的插入将类似于:

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;

答案 1 :(得分:0)

一个approch将创建2个表一个用于单词,另一个用于同义词,如下面的

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 

对于每个单词,如果单词存在则在Word表中查找,如果不存在,则只需获取现有条目的id。 使用dictionary.synonym(word)获取单词的同义词。对于每个同义词查找同义词表,其中包含来自上方的单词id和同义词,如果不存在,则插入其他移动到下一个同义词。

对所有单词重复此操作。

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

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