Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cs50中的python和sqlite3基本问题_Python_Sqlite_Cs50 - Fatal编程技术网

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

  • Minor:通常,不建议调用与内置Python函数同名的变量。看

  • 正如我在评论中所建议的,您需要插入一个元组:

  • 解决方案

    插入后,您需要从
    shows
    表中选择
    title
    。另外,从所选内容中检索id,然后将其插入
    genres
    表中

    代码的简化版本,以展示如何执行此操作:

    db.execute(
        "INSERT INTO genres (show_id, genre) VALUES (?, ?)",
        (id_, genre)
    )
    
    有关更多详细信息,请查看上的“我的代码”

    SELECT
    语句可能看起来有点复杂。简而言之,它获取匹配的标题并返回最大的id。因为标题可能相同,所以您总是获取最后插入的匹配的标题

    关于此类调试问题的一般建议

  • 尽可能多地使用打印
  • 使用和函数查看方法并能够搜索类型
  • 在GitHub上搜索文档或示例

  • 这回答了你的问题吗?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()