python中的sqlite报告了语法,但在sqlite控制台中没有问题

发布于 2025-01-28 05:10:45 字数 2903 浏览 1 评论 0原文

我想将一些数据插入数据库,并使用下面的代码,但是当我运行它时,Python解释器重新装置为sqlite3.operationalerror:near“ s”:Syntax Error。然后,我复制了由Python Link打印的SQL 插入Movie250(info_link,pic_link,central_name,其他_name,score,评分,速率,简介,简介,info)值('https://movie.douban.com/subject/subject/subject/1292052/'' ,'https://img2.doubanio.com/view/photo/s_ratio_poster/public/pbullic/p480747492.jpg',''''','shawshank rexemption',9.7,2615494 :弗兰克·弗兰克·达拉伯特没有任何问题。

def save_data_to_db(data: list | None,
                    db_url: str) -> None:
    conn: sqlite3.Connection = init_database(db_url)
    print('Database loaded...')

    cursor: sqlite3.Cursor = conn.cursor()

    for datum in data:
        sql = "insert into movie250" \
              "(" \
              "`info_link`, " \
              "`pic_link`, " \
              "`chinese_name`, " \
              "`other_name`, " \
              "`score`, " \
              "`rate`, " \
              "`introduction`, " \
              "`info`" \
              ") " \
              "values " \
              f"('{datum[0]}', '{datum[1]}', '{datum[2]}', '{datum[3]}', {datum[4]}, {datum[5]}, '{datum[6]}', '{datum[7]}')"
        print(f"Executing sql: [{sql}]")
        cursor.execute(sql)
        conn.commit()

    return None

我试图调试它,发现值SQL是

控制台报告:

发生错误之前的最后一个SQL运行:

insert into movie250(`info_link`, `pic_link`, `chinese_name`, `other_name`, `score`, `rate`, `introduction`, `info`) values ('https://movie.douban.com/subject/1291561/', 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2557573348.jpg', '千与千寻', '千と千尋の神隠し', 9.4, 2043030, '最好的宫崎骏,最好的久石让 ', '导演: 宫崎骏 Hayao Miyazaki   主演: 柊瑠美 Rumi Hîragi   入野自由 Miy... 2001   日本   剧情 动画 奇幻')

完整堆栈跟踪报告:

Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm 2021.3.3\plugins\python\helpers\pydev\pydevd.py", line 1483, in _exec
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm 2021.3.3\plugins\python\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "D:/workspace/python/douban-movies-spider/main.py", line 214, in <module>
    save_data_to_db(data_list, "./movies.db")
  File "D:/workspace/python/douban-movies-spider/main.py", line 199, in save_data_to_db
    cursor.execute(sql)
sqlite3.OperationalError: near "s": syntax error

I want to insert some data to the database, and using the code below, but when I running it, the python interpreter repoted sqlite3.OperationalError: near "s": syntax error. Then I copied the sql printed by python link insert into movie250(info_link, pic_link, chinese_name, other_name, score, rate, introduction, info) values ('https://movie.douban.com/subject/1292052/', 'https://img2.doubanio.com/view/photo/s_ratio_poster/public/p480747492.jpg', '肖申克的救赎', 'The Shawshank Redemption', 9.7, 2615494, '希望让人自由', '导演: 弗兰克·德拉邦特 Frank Darabont   主演: 蒂姆·罗宾斯 Tim Robbins ... 1994   美国   犯罪 剧情') to sqlite console and there is no any problem.

def save_data_to_db(data: list | None,
                    db_url: str) -> None:
    conn: sqlite3.Connection = init_database(db_url)
    print('Database loaded...')

    cursor: sqlite3.Cursor = conn.cursor()

    for datum in data:
        sql = "insert into movie250" \
              "(" \
              "`info_link`, " \
              "`pic_link`, " \
              "`chinese_name`, " \
              "`other_name`, " \
              "`score`, " \
              "`rate`, " \
              "`introduction`, " \
              "`info`" \
              ") " \
              "values " \
              f"('{datum[0]}', '{datum[1]}', '{datum[2]}', '{datum[3]}', {datum[4]}, {datum[5]}, '{datum[6]}', '{datum[7]}')"
        print(f"Executing sql: [{sql}]")
        cursor.execute(sql)
        conn.commit()

    return None

I tried to debug it, and I find that the value sql is
sql in debugger

Console report:
console screenshot

The last sql run before error occurred:

insert into movie250(`info_link`, `pic_link`, `chinese_name`, `other_name`, `score`, `rate`, `introduction`, `info`) values ('https://movie.douban.com/subject/1291561/', 'https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2557573348.jpg', '千与千寻', '千と千尋の神隠し', 9.4, 2043030, '最好的宫崎骏,最好的久石让 ', '导演: 宫崎骏 Hayao Miyazaki   主演: 柊瑠美 Rumi Hîragi   入野自由 Miy... 2001   日本   剧情 动画 奇幻')

Full Stack Trace Report:

Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm 2021.3.3\plugins\python\helpers\pydev\pydevd.py", line 1483, in _exec
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm 2021.3.3\plugins\python\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "D:/workspace/python/douban-movies-spider/main.py", line 214, in <module>
    save_data_to_db(data_list, "./movies.db")
  File "D:/workspace/python/douban-movies-spider/main.py", line 199, in save_data_to_db
    cursor.execute(sql)
sqlite3.OperationalError: near "s": syntax error

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

余生一个溪 2025-02-04 05:10:45
  1. 将所有项目转换为列表中的元组
for index in range(len(data)):
        data[index] = tuple(data[index])
  1. 产生类似的SQL:
sql = "insert into movie250(`info_link`, `pic_link`, " \
          "`chinese_name`, `other_name`, `score`, " \
          "`rate`, `introduction`, `info`) " \
          "values " \
          "(?, ?, ?, ?, ?, ?, ?, ?)"
  1. 然后使用Cursor Run cursor.executemany()
cursor.executemany(sql, data)

感谢 @superstormer的评论,所有这些人都给出了这些想法。

  1. convert all item to a tuple in the list
for index in range(len(data)):
        data[index] = tuple(data[index])
  1. generate a sql like this:
sql = "insert into movie250(`info_link`, `pic_link`, " \
          "`chinese_name`, `other_name`, `score`, " \
          "`rate`, `introduction`, `info`) " \
          "values " \
          "(?, ?, ?, ?, ?, ?, ?, ?)"
  1. then use cursor run cursor.executemany()
cursor.executemany(sql, data)

Thanks to @SuperStormer's comment, and all those people gave the ideas.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文