Python 3.x Python sqlite3:插入表_b时,表_a中的行循环停止

Python 3.x Python sqlite3:插入表_b时,表_a中的行循环停止,python-3.x,sqlite,Python 3.x,Sqlite,尝试循环表_a中的行,将它们传递到函数中,并将输出插入表_b。我可以设法循环表a中的行,但只要我尝试向表b插入一些内容,我的脚本就会停止 with sqlite3.connect(db_path) as db: cursor = db.cursor() cursor.execute("""SELECT * FROM cars""") for row in cursor: car_price = get_car_price

尝试循环表_a中的行,将它们传递到函数中,并将输出插入表_b。我可以设法循环表a中的行,但只要我尝试向表b插入一些内容,我的脚本就会停止

with sqlite3.connect(db_path) as db:
    cursor = db.cursor()

cursor.execute("""SELECT * FROM cars""")

for row in cursor:
  car_price = get_car_price(row[0])
  cursor.execute("""INSERT INTO car_prices (price, car_id) VALUES (?,?);""",(car_price, row[0]))
输出:

[Finished in 1.0s]
(1, "car_1")
(2, "car_2")
...
(n, "car_n")
[Finished in 0.7s]
这很奇怪,因为下面的代码可以工作,但只要我尝试执行car_prices表(如前面的代码),代码就在第一次迭代时结束

with sqlite3.connect(db_path) as db:
    cursor = db.cursor()

cursor.execute("""SELECT * FROM cars""")

for row in cursor:
  print(row)
输出:

[Finished in 1.0s]
(1, "car_1")
(2, "car_2")
...
(n, "car_n")
[Finished in 0.7s]
如所问,以下是.schema:

sqlite> .schema
CREATE TABLE IF NOT EXISTS "cars" (
        "id"    integer NOT NULL,
        "name"  text NOT NULL,
        "website_url"   text NOT NULL,
        PRIMARY KEY("id")
);
CREATE TABLE IF NOT EXISTS "car_prices" (
        "price_id"      integer,
        "price" NUMERIC NOT NULL,
        "car_id"        integer NOT NULL,
        PRIMARY KEY("price_id"),
        FOREIGN KEY("car_id") REFERENCES "cars"("id")


问题是您正在重用游标,丢弃第一次查询的结果

这里有一个问题(如果你在问题中包含了这个,你可能会得到一个更快的答案,因为人们参与进来会花费更少的精力):

在没有参数的情况下运行,它将使用相同的光标,重现您的问题:

python-sqlite-stops$ ./stuff.py
(0, 'Lolvo', 'http://example.com/lolvo') 101
car_prices: (1, 101, 0)
python-sqlite-stops$ ./stuff.py sep
(0, 'Lolvo', 'http://example.com/lolvo') 101
(1, 'Yotoya', 'http://example.com/yotoya') 112
(2, 'Edison', 'http://example.com/edison') 123
car_prices: (1, 101, 0)
car_prices: (2, 112, 1)
car_prices: (3, 123, 2)
将其设为“sep”作为参数,它将使用单独的光标进行插入,从而解决您的问题:

python-sqlite-stops$ ./stuff.py
(0, 'Lolvo', 'http://example.com/lolvo') 101
car_prices: (1, 101, 0)
python-sqlite-stops$ ./stuff.py sep
(0, 'Lolvo', 'http://example.com/lolvo') 101
(1, 'Yotoya', 'http://example.com/yotoya') 112
(2, 'Edison', 'http://example.com/edison') 123
car_prices: (1, 101, 0)
car_prices: (2, 112, 1)
car_prices: (3, 123, 2)

只需对插入使用
db.execute()
,就可以使它变得更简单;没有
cursor()
必要的调用。

您的cars表的.schema是什么?例如,
INSERT INTO car\u prices(price,car\u id)从cars中选择price,car\u id有效。在不了解cars表方案的情况下,我无法确定SQL是否有效。我不知道模式是什么,所以我没有创建一个模式。cars表有两列:car_id(主键)和car_名称。car\u prices表有三列,price\u id(主键)、price、car\u id(外键)希望这有帮助。运行
sqlite3 mydatabasefile.db
然后运行
.schema
命令。用结果编辑您的问题。@Dougie done;)