如何解决如何在Python / SQLite中使用外键
我有一个Python数据结构,正试图放入SQLite数据库中。有些字段具有多个值,所以我正在尝试一对多关系,对此我感到困惑。 这是一个可重现的小示例:
import sqlite3
people = {}
people["0f98"] = {
"Cat": "N","Name": "Joe Bloggs","Town": "Carlisle,Cumbria","Number": [("34","1972-1980"),("159","1982-1986"),("200","1987")] }
people["0219"] = {
"Cat": "N","Name": "Bill Baggins","Town": "Plankton,Berkshire","Number": [("87","2001-2017")] }
dbname = "messing.db"
conn = sqlite3.connect(dbname)
c = conn.cursor()
c.execute('''DROP TABLE IF EXISTS people ;''')
c.execute('''DROP TABLE IF EXISTS numbers ;''')
c.execute('''CREATE TABLE people (
id text PRIMARY KEY,cat text NOT NULL,name text NOT NULL,town text,number text ) ; ''')
c.execute('''CREATE TABLE numbers (
id TEXT NOT NULL,number TEXT,years TEXT NOT NULL,FOREIGN KEY(id) REFERENCES people(id) ) ; ''' )
for uid in people:
v0 = people[uid]["Cat"]
v1 = people[uid]["Name"]
v2 = people[uid]["Town"]
c.execute("INSERT INTO people (id,cat,name,town) VALUES (?,?,?)",(uid,v0,v1,v2) )
for n,y in people[uid]["Number"]:
c.execute("INSERT INTO numbers (id,number,years) VALUES (?,n,y) )
conn.commit()
c.execute("SELECT * from people")
people = c.fetchall()
for row in people:
uid=row[0]
cat=row[1]
name=row[2]
town=row[3]
numbers=row[4]
print(uid,town,numbers)
这会将数字字段打印为无。
0f98 N Joe Bloggs Carlisle,Cumbria None
0219 N Bill Baggins Plankton,Berkshire None
我认为应该从数字表中读取numbers
行,但事实并非如此。但是,将最后一位更改为
c.execute("SELECT * from people")
people = c.fetchall()
for row in people:
uid=row[0]
cat=row[1]
name=row[2]
town=row[3]
c.execute("SELECT number,years from numbers WHERE id = ?",))
numbers=c.fetchall()
print(uid,numbers)
这确实具有预期的结果:
0f98 N Joe Bloggs Carlisle,Cumbria [('34','1972-1980'),('159','1982-1986'),('200','1987')]
0219 N Bill Baggins Plankton,Berkshire [('87','2001-2017')]
但是,在CREATE语句中没有FOREIGN KEY(id) REFERENCES people(id)
,我得到的结果完全相同。
我是否误解了外键的工作方式,或者我没有正确实现它?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。