import csv
import sqlite3
open("shows.db", "w").close()
con = sqlite3.connect('shows.db')
db = con.cursor()
db.execute("CREATE TABLE shows (id INTEGER, title TEXT, PRIMARY KEY(id))")
db.execute("CREATE TABLE genres (show_id INTEGER, genre TEXT, FOREIGN KEY(show_id) REFERENCES shows(id))")
with open("/Users/xxx/Downloads/CS50 2019 - Lecture 7 - Favorite TV Shows (Responses) - Form Responses 1.csv", "r") as file:
reader = csv.DictReader(file)
for row in reader:
title = row["title"].strip().upper()
id = db.execute("INSERT INTO shows (title) VALUES(?)", (title,))
for genre in row["genres"].split(", "):
db.execute("INSERT INTO genres (show_id, genre) VALUES(?, ?)", id,genre)
con.commit()
con.close()当我运行这段代码时,我认为在这行"db.execute("INSERT INTO genres (show_id, genre) VALUES(?, ?)", id,genre)"中会出现问题。
我的控制台说
"db.execute("INSERT INTO genres (show_id, genre) VALUES(?, ?)", id,genre)
TypeError: function takes at most 2 arguments (3 given)" 我不明白为什么它说3给予,即使我提出了两个论点( id,体裁)
发布于 2021-04-25 17:16:16
问题与代码
.fetchall()、.fetchmany()或.fetchone()。id = db.execute("INSERT INTO shows (title) VALUES(?)", (title,))INSERT操作返回的是None,而不是实际的iddb.execute(
"INSERT INTO genres (show_id, genre) VALUES (?, ?)",
(id_, genre)
)溶液
插入后,需要从title表中选择shows。另外,从所选内容中检索id,然后将其插入genres表中。
代码的简化版本,以展示如何做到这一点:
import csv
import sqlite3
open("shows.db", "w").close()
con = sqlite3.connect('shows.db')
db = con.cursor()
db.execute("CREATE TABLE shows (id INTEGER, title TEXT, PRIMARY KEY(id))")
db.execute("CREATE TABLE genres (show_id INTEGER, genre TEXT, FOREIGN KEY(show_id) REFERENCES shows(id))")
shows = ["FRIENS", "Game of Trhones", "Want", "Scooby Doo"]
genres = ["Comedy", "Fantasy", "Action", "Cartoon"]
for ind, show in enumerate(shows):
db.execute("INSERT INTO shows (title) VALUES(?)", (show,))
id_ = con.execute(
"SELECT id FROM shows WHERE title = :show ORDER BY id DESC LIMIT 1",
{
"show": show
},
).fetchone()
db.execute(
"INSERT INTO genres (show_id, genre) VALUES (?, ?)",
(id_[0], genres[ind], )
)
con.commit()
con.close()有关更多细节,请查看GitHub上的代码。
SELECT语句看起来可能有点复杂。简单地说,它使用匹配的标题并返回最大的id。由于标题可能是相同的,所以您总是使用最后插入的匹配项。
关于调试问题的一般建议(如)
发布于 2021-04-25 09:16:04
我能看出你的问题。这是因为您正在尝试将id中的添加和类添加到查询中,就像在sqlite3文档中一样。在文档中,他们做了您在元组中试图做的事情,但是在函数调用中做到了这一点。
试一试:
sql_query = ("INSERT INTO genres (show_id, genre) VALUES(?, ?)", id, genre)
db.execute(sql_query)或者你可以把它放在一条线上:
# notice how there is 2 parenthesis
# ↓ ↓
db.execute(("INSERT INTO genres (show_id, genre) VALUES(?, ?)", id, genre))
# ↑ ↑https://stackoverflow.com/questions/67251557
复制相似问题