首页 > 解决方案 > 如何从 csv 只更新数据库中的两个列而不使用 python 和 sqlite3 触及其他列中的数据?

问题描述

嗨,我有一个看起来像这张图片的数据库在此处输入图像描述

我有一个 csv,它有两列 City 和 Main_city。我想将 Main_City 针对 City 列从 csv 更新到数据库中,但不会损坏数据库中的其他数据。我怎样才能做到这一点?

我不知道它背后的逻辑。

以下是我的代码:

import csv

data_obj = {}
def readfiles():
    f = open("city.csv", "r")
    data = f.read()
    lst = data.split("\n")
    for i in range(1, len(lst)):
        val = lst[i].split(",")
        data_obj[val[0]] = val[1]
        #print(data_obj[val[0]])
    print(data_obj)
readfiles()

conn = sqlite3.connect('99_data_increment.db')
c = conn.cursor()
c.execute("CREATE TABLE IF NOT EXISTS crawled (id INTEGER PRIMARY KEY, State , XID , Project_Name , City , Main_City , Registration_Number , Promoter_Name , Rera_URL , PDF_text, Crawled_Date , Status, Names, Transaction_Date, Comments, Call_Contact_Number, Creation_Type, Builder_Website)")
New_project_db.insert(statess, XID, Projectname, City, maincity, Registration_number, promotername, rera_url, blank, fdate, "CREATED", agents_names, fdate, blank, blank, blank, blank)
## didn't getting logic behind

我的 csv 看起来像这样:

在此处输入图像描述

标签: databasecsvsqlitepython-3.6

解决方案


如果您将带有更新的 CSV 文件导入到临时表中,这真的很容易。我想说 pandas 在 Python 中使这个导入变得微不足道,但我还不够熟悉,不能肯定地说。至少实际使用您正在导入但不使用的 csv 库会有所帮助。

无论如何,这是从 sqlite3 shell 执行此操作的一种方法,这对于一次性更新很方便,但如果您尝试将其自动化以重复使用,则不是很好。不过,应该很容易适应 python,因为UPDATE一旦将新数据加载到数据库中,这就是重要的部分。

$ sqlite3 99_data_increment.db
sqlite> .mode csv
sqlite> .import updates.csv new_cities
sqlite> CREATE INDEX new_cities_idx ON new_cities(City);
sqlite> UPDATE crawled AS c
         SET Main_City =
            (SELECT "Main City" FROM new_cities AS n WHERE c.City = n.City)
         WHERE EXISTS (SELECT * FROM new_cities AS n WHERE c.City = n.City);
sqlite> DROP TABLE new_cities;
sqlite> .quit

推荐阅读