在 sqlite3 中插入外键,用于 python



我有一个名为soccer.db的数据库,其中包含两个表teamgame

我使用数据库浏览器创建了数据库。我的sqlite3版本是 3.30.0。我还确认启用/选中了外键编译指示。

CREATE TABLE "team" (
"id"    INTEGER UNIQUE,
"opponent_name" TEXT,
"rank_when played"  INTEGER,
"date_added"    TEXT,
PRIMARY KEY("id" AUTOINCREMENT)
);
CREATE TABLE "game" (
"id"    INTEGER,
"opponent_id"   INTEGER,
"goals_for" INTEGER,
"goals_against" INTEGER,
"date_added"    TEXT,
PRIMARY KEY("id" AUTOINCREMENT),
FOREIGN KEY("opponent_id") REFERENCES "team"("id")
);

现在,我尝试使用以下代码在 jupyter 笔记本中使用 sqlite3 将每周游戏信息插入game数据库中。

conn = sqlite3.connect('soccer.db')
c = conn.cursor()
c.execute('INSERT INTO team (opponent_name, rank_when_played, date_added) VALUES (?,?,?)', ('Manchester_City', 4, '04/22/2018')
c.execute('INSERT INTO game (opponent_id, goals_for, goals_against, date_added) VALUES (?,?,?,?)', ((SELECT id FROM team WHERE opponent_name = 'Machester City'), 3, 2, '04/22/2018')
conn.commit()
c.close()

当我尝试运行代码时,出现以下错误。我确认第一个插入语句有效,因此我假设错误是指第二个插入语句。

SyntaxError: invalid syntax

我做错了什么?

您应该使用光标的lastrowid,如下所示:

c = conn.cursor()
c.execute('INSERT INTO team (opponent_name, rank_when_played, date_added) VALUES (?,?,?)', 
('Manchester_City', 4, '04/22/2018'))
c.execute('INSERT INTO game (opponent_id, goals_for, goals_against, date_added) VALUES (?,?,?,?)', 
(c.lastrowid, 3, 2, '04/22/2018'))
# ==========
conn.commit()

另一方面,如果您想使用现有团队,则可以执行以下操作:

c = conn.cursor()
c.execute("Select id from team where opponent_name = ?", ('Manchester_City', ))
res = c.fetchone()
team_id = res[0]
c.execute('INSERT INTO game (opponent_id, goals_for, goals_against, date_added) VALUES (?,?,?,?)', 
(team_id, 3, 2, '07/23/2018'))
conn.commit()

最新更新