首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中插入PostgreSQL数据库而不知道变量数

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

Stack Overflow用户
提问于 2017-03-03 01:43:44
回答 2查看 605关注 0票数 1

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

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

我成功地对此任务进行编程的唯一方法是这样一组糟糕的if语句:

代码语言:javascript
复制
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返回一个list对象。

编辑:

因此,多亏了@systemjack,我以这样的方式更改了系统,即有3个表列。id (这是一个连续的主键)、word和synos (最初是syn,但只是为了确保它不是某个奇怪的关键字)。每个单词应该与一个同义词一起添加到一行中,然后下一行可以是具有不同同义词的同一个单词,因此on...Anyway,新方法如下:

代码语言:javascript
复制
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输出:

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-03 06:19:28

一种典型的关系方法将其设置为具有word列和第二个同义词列的两列表。那么每个单词-同义词组合都会有一行。

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

最简单的实现需要每个字多个插入,但这不是什么大事。同时也有ways to batch up the inserts

如果您真的希望每个字有一行,可以使用PARTAGG的组合在一列中存储变量数的值。不过,我强烈建议采用前一种方法。

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

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

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

代码语言:javascript
复制
for word in textlist:
    syns = dictionary.synonym(word)
    for syn in syns:
        cursor.execute('insert into syns (word, syn) values (%s, %s);', (word, syn))

那么,如果您想查看一个单词的所有同义词,您可以这样做:

代码语言:javascript
复制
select word, string_agg(syn, ', ') 
from syns where word='perspicuitous'
group by word;
票数 3
EN

Stack Overflow用户

发布于 2017-03-03 12:50:14

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

代码语言:javascript
复制
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存在,则在Word表中查找,如果没有插入,则只需获取现有条目的id即可。使用dictionary.synonym( word )获取单词的同义词。对于每个同义词,从上面查找带有word id的同义词表和同义词,如果不存在,则插入else移动到下一个同义词。

对所有的单词重复这句话。

选择一个单词的同义词成为一个查询,如下所示:

代码语言:javascript
复制
select syn.synonym from synonym syn , word wd 
where wd.id = syn.word_id and wd.word = 'foo'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42569168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档