将URL写入数据库(sqlite3.OperationalError:没有此类列:)

2024-05-17 15:24:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在一个sqlite数据库中写入一些URL。我已经让这个工作没有网址。如果我用一个数字替换“Volumes/data/rc3/2/sdss/sdss_r_0_0.fits”,它甚至可以工作。在

c.execute("INSERT INTO rc3 (ID,ra,dec,radius,PGC_number,new_ra, new_dec, new_radius,ufits,gfits,rfits,ifits,zfits,best,low,in_SDSS_footprint,clean,error)VALUES({},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{})".format(n,pgc,ra,dec,radius,new_ra,new_dec,new_radius,2, 3, 4, 5, 6, 7,8,in_SDSS_footprint,clean,error))

它似乎将URL误认为是列,因为它抛出了错误:

^{pr2}$

但我不知道该怎么办。提前谢谢。在


Tags: inclean数据库urlnewsqliteerrordec
1条回答
网友
1楼 · 发布于 2024-05-17 15:24:34

不要试图通过将值嵌入字符串格式命令来创建SQL语句。相反,请使用SQL参数。在

而不是这样:

c.execute("INSERT INTO breakfast (id, spam, eggs) VALUES({}, {}, {})".format(
    id, spam, eggs))

…这样做:

^{pr2}$

这在^{}文档的最上面进行了解释。但简单地说,这样做的原因是(按重要性的大致顺序):

  • 避免{a2}如果任何数据可能来自恶意或不合格的用户或外部程序。在
  • 意味着您不必担心如何引用/转义字符串、格式数字等
  • 使来自不适当值类型的错误更清晰、更易于调试。在
  • 当1000条语句完全不同的时候,你可以用1000条完全不同的语句来优化你的缓存。在
  • 允许您使用executemany,它比循环更具可读性,也可能给SQL引擎更多的优化机会。在

对你来说,这是你遇到的第二个。您试图使用字符串Volumes/data/rc3/2/sdss/SDSS_r_0_0.fits作为值。这是一个表达式,要求sqlite将Volumes列除以data列,除以rc3,依此类推。如果希望将字符串存储为字符串,则需要将其放在引号中。在

但是,同样,不要试图通过添加引号来解决这个问题;只需使用参数。在

相关问题 更多 >