database - 如何从 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 看起来像这样:
解决方案
如果您将带有更新的 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
推荐阅读
- jquery - 如何在 html 中的图像标签中调用 Jquery 变量
- javascript - JavaScript:将未知数量的参数从一种方法传递给另一种方法
- html - HTML/CSS 元素在分屏设计中的绝对位置
- javascript - Javascript/CSS 侧边栏切换
- google-apps-script - 如何使用 for 循环设置值(用于列)
- c++ - 如何在 BST 中获得小于给定键的所有值?
- java - 在 Java 中访问面板的问题的解决方案?
- sprite-kit - 未使用 Metal,但出现错误“Metal GPU Frame Capture Enabled”
- magento - 每次我尝试启用或禁用任何模块时,Magento 2 都会崩溃
- rust - 在 build.rs 中获取 --bin 参数