我正在尝试将一些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
但我不知道该怎么做。提前谢谢。
答案 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
文档的最顶部进行了解释。但简单地说,以这种方式做事的原因是(粗略的重要性):
executemany
,它比循环更易读,也可以为SQL引擎提供更多优化机会。在你的情况下,这是你遇到的第二个。您正在尝试将字符串Volumes/data/rc3/2/sdss/SDSS_r_0_0.fits
用作值。这是一个表达式,要求sqlite将Volumes
列除以data
列,除以rc3
等。如果您希望将字符串存储为字符串,则需要把它放在引号中。
但是,再次,不要试图通过添加引号来解决这个问题;只需使用参数。