当使用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的个人练习。
答案 0 :(得分:4)
您的设计违背了关系数据库的精神(其中Wikipedia将关系定义为“具有相同属性”的一组元组),其中sqlite是一个。
这里适当的设计是单词表和定义表,由外键链接。如果你的单词除了内容之外没有其他属性,你可以跳过单词表,只使用定义表中的键。
但请注意,每个定义只有一行,而不是每个单词一行。
答案 1 :(得分: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的列。在此图表中,word_id
中的FK Definiton
引用了id
的PK Word
。这种关系由两行之间的-1---*-
连接来表示。