如何使用python和sqlite3从csv中仅更新数据库中的两个列而不接触其他列中的数据?

时间:2018-08-21 08:42:40

标签: database csv sqlite python-3.6

嗨,我有一个看起来像这张图片enter image description here

的数据库

我有一个csv,其中有两列City和Main_city。我想将“城市”列中的Main_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看起来像这样:

enter image description here

1 个答案:

答案 0 :(得分:1)

如果将包含更新的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