我使用sqlite来组织使用scraper脚本获取的数据,在执行"insert into"命令时遇到了问题。
作为一个Python爱好者,我正在为一个电子网站制作一个刮刀。我已经有了一个工作脚本,可以抓取所有页面,直到我决定修改代码创建一个新的列,并使用今天的日期命名该列。现在,由于某种原因,向表中插入数据的SQL命令拒绝执行我添加的新列。
是否尝试使用将新列添加到SQL命令中?方法和.format()方法,但没有成功。尝试了各种"周围的位置"?s和{}s。
这是代码:
class Product:
def __init__(self, prodId, title, price=None):
self.prodId = prodId
self.title = title
self.price = price
self.currDatePriceCloumnName = date + 'Price'
def insertToTable(self):
self.addColumn()
conn = sqlite3.connect(databaseName)
c = conn.cursor()
c.execute("insert into {} (?,?,?) values (?,?,?)".format(table),('Product_ID','Title',str(self.currDatePriceCloumnName),str(self.prodId),str(self.title),str(self.price)))
conn.commit()
conn.close()
def addColumn(self):
conn = sqlite3.connect(databaseName)
c = conn.cursor()
try:
c.execute("alter table {} add column '?'".format(table),(str(self.currDatePriceCloumnName),))
conn.commit()
conn.close()
except:
pass
我希望insertToTable
中的c.execute
将数据插入到表中,但我得到的是这个错误:
File "/home/sergio/Desktop/test/scraper.py", line 67, in insertToTable
c.execute("insert into {} (?,?,?) values (?,?,?)".format(table),('Product_ID','Title',str(self.currDatePriceCloumnName),str(self.prodId),str(self.title),str(self.price)))
sqlite3.OperationalError: near "?": syntax error
奇怪的是,列是创建的,但没有填充。当我使用.format()
方法时,错误具有所需的列名,而不是?,这告诉我,问题可能与我使用self.currDatePriceCloumnName
的事实有关,但我一直被困在这里。
请帮忙。。提前感谢!=]
您在中有一个拼写错误
c.execute("insert into {} (?,?,?) values (?,?,?)".format(table),('Product_ID','Title',str(self.currDatePriceCloumnName),str(self.prodId),str(self.title),str(self.price)))
地点:
values (?,?,?)".format(table),
.format(表)的末尾是您插入字符串中的全部内容。额外的)
导致.format()结束抛出语法错误,因为它不需要,
。您没有传递任何其他值。
也就是说,以后不要在SQL语句中使用字符串格式(作为一般的附带说明),因为出于安全目的,这是一种糟糕的做法:
https://www.w3schools.com/sql/sql_injection.asp