0

当使用 pythons sqlite3 模块时,如果我要创建一个表并且第一行有 4 列,那么下一行必须有 4 列还是我可以有更多/更少?

我正在寻找创建词汇单词的数据库。每个词可能有不同数量的定义。

例如,“set”的定义要比“panacea”多得多。

我会用一个刮板来处理这个词汇数据库,它可以很容易地从字典参考网站上查找单词和定义。

#! /usr/bin/env python
import mechanize
from BeautifulSoup import BeautifulSoup
import sys
import sqlite3

def dictionary(word):
    br = mechanize.Browser()
    response = br.open('http://www.dictionary.reference.com')
    br.select_form(nr=0)
    br.form['q'] = word 
    br.submit()
    definition = BeautifulSoup(br.response().read())
    trans = definition.findAll('td',{'class':'td3n2'})
    fin = [i.text for i in trans]
    query = {}
    for i in fin: 
        query[fin.index(i)] = i

    ## The code above is given a word to look up and creates a 'dict' of its definiton from the site.

    connection = sqlite3.connect('vocab.db')
    with connection:
        spot = connection.cursor()

        ## This is where my uncertainty is.  I'm not sure if I should iterate over the dict values and 'INSERT' for each definition or if there is a way to put them in all at once? 

        spot.execute("CREATE TABLE Words(Name TEXT, Definition TEXT)")
        spot.execute("INSERT INTO Words VALUES(word, Definition (for each number of definitions))")

    return query


print dictionary(sys.argv[1]) 

这不是作业,而是学习 sqlite3 的个人练习。

4

2 回答 2

4

您的设计违背了关系数据库的精神(维基百科将关系定义为“一组具有相同属性的元组”),其中 sqlite 就是其中之一。

这里适当的设计是一个单词表和一个定义表,通过外键链接。如果您的单词除了其内容之外没有其他属性,您可以跳过单词表并仅使用定义表中的键。

但是请注意,每个定义只有一行,而不是每个单词一个。

于 2012-08-13T06:30:08.323 回答
3

如果我要创建一个表并且第一行有 4 列,那么下一行必须有 4 列还是我可以有更多/更少?

您不能在 SQLite 中创建行具有不同数量的单元格的表。不过,您可以放入Null一行的单元格中。

Perpahs 你需要一个1-to-n关系:每个单词可以有很多定义。

编辑:

用两张表看一下这张图,Word然后Definiton

                +------------+
+-------+       | Definition |
| Word  |       +------------+
+-------+       | id PK      |
| id PK |-1---*-| word_id FK |
| text  |       | text       |
+-------+       +------------+

在这两个表中,都是表PK主键FK标记外键,即引用不同表的 PK 的列。在此图中,FK word_idinDefiniton引用 的 PK idWord这种关系由-1---*-两行之间的连接来表示。

于 2012-08-13T06:26:48.680 回答