首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自cs50的python和cs50基本问题

来自cs50的python和cs50基本问题
EN

Stack Overflow用户
提问于 2021-04-25 09:00:46
回答 2查看 349关注 0票数 0
代码语言:javascript
复制
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)"中会出现问题。

我的控制台说

代码语言:javascript
复制
"db.execute("INSERT INTO genres (show_id, genre) VALUES(?, ?)", id,genre)
TypeError: function takes at most 2 arguments (3 given)" 

我不明白为什么它说3给予,即使我提出了两个论点( id,体裁)

在这里输入图像描述

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-25 17:16:16

问题与代码

  1. 这一行返回光标。为了获得结果,您需要调用终端操作,如.fetchall().fetchmany().fetchone()
代码语言:javascript
复制
id = db.execute("INSERT INTO shows (title) VALUES(?)", (title,))
  1. 由于您没有调用终端操作符或打印结果,所以您不会知道INSERT操作返回的是None,而不是实际的id
  2. 小调:一般情况下,不建议调用变量与内置Python函数的名称相同。见id
  3. 正如我在评论中所建议的,您需要插入一个元组:
代码语言:javascript
复制
db.execute(
    "INSERT INTO genres (show_id, genre) VALUES (?, ?)",
    (id_, genre)
)

溶液

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

代码的简化版本,以展示如何做到这一点:

代码语言:javascript
复制
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。由于标题可能是相同的,所以您总是使用最后插入的匹配项。

关于调试问题的一般建议(如)

  1. 尽可能多地使用打印
  2. 使用目录类型函数查看方法并能够进行google类型
  3. 在GitHub上搜索文档或示例
票数 0
EN

Stack Overflow用户

发布于 2021-04-25 09:16:04

我能看出你的问题。这是因为您正在尝试将id中的添加和类添加到查询中,就像在sqlite3文档中一样。在文档中,他们做了您在元组中试图做的事情,但是在函数调用中做到了这一点。

试一试:

代码语言:javascript
复制
sql_query = ("INSERT INTO genres (show_id, genre) VALUES(?, ?)", id, genre)
db.execute(sql_query)

或者你可以把它放在一条线上:

代码语言:javascript
复制
# notice how there is 2 parenthesis
#          ↓                                                             ↓
db.execute(("INSERT INTO genres (show_id, genre) VALUES(?, ?)", id, genre))
#          ↑                                                             ↑
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67251557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档