使用SQLAlchemy在循环中将变量插入SQLite数据库

0 投票
1 回答
1126 浏览
提问于 2025-04-17 09:20

我正在使用SQLAlchemy和Python 2.6.7,在一个循环中将数据插入到SQLite数据库里。

简单说一下背景,我用字典的方法在循环中创建了一组变量。我想从一个网站上抓取一些数据,抓取到的数据数量在1到12之间,具体如下:

overall_star_ratings = doc.findall("//div[@id='maincontent2']/div/table/tr[2]//td/img")
count_stars = len(overall_star_ratings)

在一个空的SQLite数据库里,我有变量“t1_star”,“t2_star”,一直到“t12_star”。我想遍历“overall_star_ratings”这个列表,把这些值赋给数据库里的变量,具体的值会根据页面的不同而变化。我使用SQLAlchemy,所以(虽然说得不太高效)我想做的就是把值赋给变量,然后插入到数据库里,代码里我在循环“rows”,这样“row”命令就会把*t1_star*的值插入到数据库的“t1_star”这一列,依此类推:

if count==2:
    row.t1_star = overall_star_ratings[1].get('alt') 
    row.t2_star = overall_star_ratings[2].get('alt')         
elif count==1:
    row.t1_star = overall_star_ratings[1].get('alt') 

这个方法可以用,但效率很低,所以我尝试用“字典”方法来创建变量,就像我在Stack Overflow上看到的一些“变量变量”的问题那样。于是,我尝试了以下方法:

d = {}
for x in range(1, count_stars+1):
    count = x-1 
    d["t{0}_star".format(x)] = overall_star_ratings[count].get('alt') 

这个方法可以成功创建字典里的“t1_star”,“t2_star”这些键和对应的值。问题出现在我尝试把数据插入数据库的时候。我在上面的循环中尝试添加了以下内容:

    key = "t{0}_star".format(x)
    value = d["t{0}_star".format(x)]
    row.key = value

我还尝试在上面的循环完成后添加以下内容:

for key, value in d.items():
    row.key = value

问题是没有插入任何数据。看起来问题出在row.key这一部分,而不是value,但我不太确定。从我看到的情况来看,这些keys和我用“低效”方法时看到的字符串是一样的(也就是t1_star等等),所以我不明白为什么这个方法不奏效。

如果有任何建议,我将非常感激!

谢谢,

Greg

1 个回答

3

在Python中,访问属性的方式并不是你想的那样。row.key 是在查找一个叫做 "key" 的属性,而不是查找变量 key 中的值。

你可能需要使用 setattr 这个方法:

setattr(row, key, value)

撰写回答