将URL写入数据库(sqlite3.OperationalError:没有这样的列:)

时间:2014-07-29 21:13:08

标签: python sql database sqlite

我正在尝试将一些URL写入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误认为是一个列,因为它抛出了错误:

c.execute("CREATE TABLE rc3 (ID INT , PGC_number INT,ra REAL, dec REAL,radius REAL,new_ra REAL,new_dec REAL,new_radius REAL, ufits TEXT, gfits TEXT, rfits TEXT ,ifits TEXT, zfits TEXT, best TEXT, low TEXT,in_SDSS_footprint BIT ,clean BIT, error INT,PRIMARY KEY(ID))")
....
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(0, 0.0075, 47.2744444444, 0.01999027436515, 2, 0, 0, 0, 'Volumes/data/rc3/2/sdss/SDSS_u_0_0.fits', 'Volumes/data/rc3/2/sdss/SDSS_g_0_0.fits', 'Volumes/data/rc3/2/sdss/SDSS_r_0_0.fits', 'Volumes/data/rc3/2/sdss/SDSS_i_0_0.fits', 'Volumes/data/rc3/2/sdss/SDSS_z_0_0.fits', 'Volumes/data/rc3/2/sdss/SDSS_0_0_BEST.tiff ', 'Volumes/data/rc3/2/sdss/SDSS_0_0_LOW.tiff ', 0, 1, 0))
sqlite3.OperationalError: no such column: Volumes 

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

1 个答案:

答案 0 :(得分:3)

永远不要尝试通过使用字符串格式化命令嵌入值来创建SQL语句。而是使用SQL参数。

而不是:

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

......这样做:

c.execute("INSERT INTO breakfast (id, spam, eggs) VALUES(?, ?, ?)",
          id, spam, eggs)

这在sqlite3文档的最顶部进行了解释。但简单地说,以这种方式做事的原因是(粗略的重要性):

  • 如果任何数据可能来自恶意或无能的用户或外部程序,则避免SQL injection
  • 意味着您不必担心如何引用/转义字符串,格式化数字等。
  • 使不适当的值类型的错误更清晰,更容易调试。
  • 允许SQL引擎将1000个单独的插入视为具有不同值的完全相同的语句,而不是1000个完全不同的语句,这使得它更有可能缓存或以其他方式进行优化。
  • 允许您使用executemany,它比循环更易读,也可以为SQL引擎提供更多优化机会。

在你的情况下,这是你遇到的第二个。您正在尝试将字符串Volumes/data/rc3/2/sdss/SDSS_r_0_0.fits用作值。这是一个表达式,要求sqlite将Volumes列除以data列,除以rc3等。如果您希望将字符串存储为字符串,则需要把它放在引号中。

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