python sqlite3 - 游标与连接 - 执行UPDATE语句

问题描述 投票:0回答:2

我在执行UPDATE语句时遇到问题。在下面的代码中,当我写con.execute()它写入数据库,但如果我写c.execute()它不写入数据库。长评论是有问题的代码所在。

最相关的片段

def write_data(con, c):
    geolocator = Nominatim()
    table = c.execute('SELECT * FROM playerdata WHERE birth_place_long is null AND birth_place is not null').fetchall()
    for i in table:

        try:
            location = getgeo(i[4], geolocator)
            lat, long = location.latitude, location.longitude
        except:
            print(i[0])
            '''  changing to c.execute doesnt work '''
            con.execute('UPDATE playerdata SET birth_place_lat = ?, birth_place_long = ? WHERE id = ?', (1, 1, i[0]))
            print("failed" + i[1] + " " + i[2])
            con.commit()
        else:
            c.execute('UPDATE playerdata SET birth_place_lat = ?, birth_place_long = ? WHERE id = ?', (lat, long, i[0]))
            print(i[1] + " " + i[2])
            con.commit()
    con.close()

完整代码如下:

import csv
from geopy.geocoders import Nominatim
import sqlite3
import socket
import geopy.exc
import pandas as pd

def connect_db():
    con = sqlite3.connect('c:/s_db2.sqlite3')
    c = con.cursor()
    return con, c


def getgeo(place, geolocator):
    try:
        location = geolocator.geocode(place)
        return location
    except (socket.timeout):
        return getgeo(place, geolocator)
    except geopy.exc.GeocoderTimedOut:
        return 0


def write_data(con, c):
    geolocator = Nominatim()
    table = c.execute('SELECT * FROM playerdata WHERE birth_place_long is null AND birth_place is not null').fetchall()
    for i in table:

        try:
            location = getgeo(i[4], geolocator)
            lat, long = location.latitude, location.longitude
        except:
            print(i[0])
            '''  changing to c.execute doesnt work '''
            con.execute('UPDATE playerdata SET birth_place_lat = ?, birth_place_long = ? WHERE id = ?', (1, 1, i[0]))
            print("failed" + i[1] + " " + i[2])
            con.commit()
        else:
            c.execute('UPDATE playerdata SET birth_place_lat = ?, birth_place_long = ? WHERE id = ?', (lat, long, i[0]))
            print(i[1] + " " + i[2])
            con.commit()
    con.close()

while True:
    write_data(connect_db()[0], connect_db()[1])
    print("************* re-running ****************")
python python-3.x sqlite
2个回答
0
投票

循环中的这一行:

write_data(connect_db()[0], connect_db()[1])

connect_db()的同一次召唤中,write_data()被召唤两次。

这类似于:

con_1, c_1 = connect_db()
con_2, c_2 = connect_db()

write_data(con_1, c_2)

您正在将连接的实例与其他实例的游标混合。

相反,你可能想要:

con_1, c_1 = connect_db()

write_data(con_1, c_1)

0
投票

conn使用的连接实例有自己的设置,即自动提交。但是,一个curso,你需要定义自动提交集,或者更确切地说,在执行sql之后保持提交。

即在con.commit()之后使用with con: c.execute()

注意,如果此逻辑在try-catch块之后执行(即异常),则可能需要在执行此逻辑之前回滚。

© www.soinside.com 2019 - 2024. All rights reserved.