cs50中的python和sqlite3基本问题
当我运行这段代码时,我认为在这一行中,cs50中的python和sqlite3基本问题,python,sqlite,cs50,Python,Sqlite,Cs50,当我运行这段代码时,我认为在这一行中,“db.execute(“插入到流派(show_id,genre)值(?)”,id,genre)”出现了问题 我的控制台说 import csv import sqlite3 open("shows.db", "w").close() con = sqlite3.connect('shows.db') db = con.cursor() db.execute("CREATE TABLE shows (
“db.execute(“插入到流派(show_id,genre)值(?)”,id,genre)”
出现了问题
我的控制台说
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()
即使我给出了两个论点(id,体裁),我也不明白为什么它说3已经给出
我能看到你的问题。这是因为您正在尝试在查询中添加id和类型,就像在sqlite3文档中一样。在文档中,他们做了您试图在元组中做的事情,但您在函数调用中做了 请尝试以下方法:
"db.execute("INSERT INTO genres (show_id, genre) VALUES(?, ?)", id,genre)
TypeError: function takes at most 2 arguments (3 given)"
或者你也可以把它放在一行纸上:
sql_query = ("INSERT INTO genres (show_id, genre) VALUES(?, ?)", id, genre)
db.execute(sql_query)
代码问题
.fetchall()
、.fetchmany()
或.fetchone()
INSERT
操作返回的是None
,而不是实际id
shows
表中选择title
。另外,从所选内容中检索id,然后将其插入genres
表中
代码的简化版本,以展示如何执行此操作:
db.execute(
"INSERT INTO genres (show_id, genre) VALUES (?, ?)",
(id_, genre)
)
有关更多详细信息,请查看上的“我的代码”
SELECT
语句可能看起来有点复杂。简而言之,它获取匹配的标题并返回最大的id。因为标题可能相同,所以您总是获取最后插入的匹配的标题
关于此类调试问题的一般建议
这回答了你的问题吗?thta是python错误,不是sql错误,方法
execute
接收到3个参数,而不是2个。SQL参数应该在元组中给出,而不是单独给出每个参数。您在第一次插入中做得很好,但在第二次插入中没有db.execute(“INSERT INTO-genres(show_id,genre)VALUES(?)”,(id,genre))
我认为您需要将其作为元组传递(id,genre),它将被视为单个参数。您正在作为单独的参数传递,现在我尝试了,但这里出现了另一个错误<代码>sqlite3.InterfaceError:绑定参数0时出错-可能是不支持的类型代码>是否表示id不是整数类型?但是在我的数据库中,我看起来像整数(比如1,2,3,…)@syha682100你不介意添加数据库模式并指出从哪里得到这个错误吗?它似乎不起作用。我只是听完了讲座。我认为问题在于,在本次讲座中,他使用了自己的sql库,但我使用了sqlite3库。但他说这个功能几乎在图书馆里都有。谢谢!这很有帮助。但我能再问你一个问题吗?当我做一行像id=con.execute(~~~~~~)
这样的代码时,它不仅包含id
中的con.execute(~~~~~~)
的值,而且还执行con.execute(~~~~~~~~~~)
?@syha682100是的,听起来不错。这是一种具有副作用的所谓功能。注意:如果您查看SELECT
语句,您将看到最后我有fetchone()
返回结果。这就是为什么你没有得到object,而是得到了实际的id。如果我只写了一个像id=con.execute(~~~)
这样的代码,而没有fetchone()
,那么它只意味着id
指出了con.execute()
?@syha682100,我想它会返回cursor
-object。您可以打印出类型并在sqlite3文档中搜索,以查看输出对应的内容。非常感谢您的回答。如果这不是太多的要求,这将是我的最后一个问题<代码>“从显示中选择id,其中title=:按id显示顺序DESC LIMIT 1”,{“show”:show},).fetchone()
。在这一行中,第一个:show
是否意味着它将通过指出“show”:show
来使用shows=[“FRIENS”,“Trhones游戏”,“Want”,“Scooby Doo”]
?如果它是正确的,那么哪个节目是“show”:show
?
id = db.execute("INSERT INTO shows (title) VALUES(?)", (title,))
db.execute(
"INSERT INTO genres (show_id, genre) VALUES (?, ?)",
(id_, genre)
)
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()