我試圖使用 Python 腳本和 Pandas DF 中的資料將新資料/值“插入”到我的 SQLite DB。第一個插入效果很好,無論是df.to_sql()還是cursor.execute("SQL STATEMENT")。但我的問題是嘗試匯入/插入新資料時。
問題 當我進行新插入時,我要么得到重復值,要么資料庫值被簡單地替換。使用其中一個資料列作為PK將不起作用,因為它們都不是真正唯一的。
目標 我要尋找的是只匯入新值,例如;如果具有所有值的行不存在INSERT否則IGNORE。
問題當插入中的某些資料是重復的并且不應該插入并且某些資料是新資料并且應該插入時,將新值插入資料庫的正確方法是什么?
專案背景、當前代碼和我做了什么
代碼的“版本 1”正在運行,我按預期獲取資料,并按預期插入資料庫。我正在通過 API 獲取 FX 匯率、規范化 JSON 并創建 Pandas DF。我做了一些資料結構并洗掉和添加了一些列。然后將其匯入資料庫。(不確定當前的作業流程是最佳實踐,對此的任何建議也將不勝感激)
# Call API...Get data...Save as JSON...
url = f'https://min-api.cryptocompare.com/data/{timeframe}?fsym={coin}&tsym={fx_converter}&limit={limiter}'
data = json.loads(requests.get(url).text)
# Normalize JSON...Create DataFrame
df = pd.json_normalize(data, ['Data'])
一些額外的 DF 結構代碼,似乎與 Q 無關
# Database Connection
cnxn = sqlite3.connect("fx_rates.db")
cursor = cnxn.cursor()
# Create table
table = f""" CREATE TABLE IF NOT EXISTS {coin}
(
time INTEGER NOT NULL,
high REAL,
low REAL,
open REAL,
volumefrom INTEGER,
volumeto INTEGER,
close REAL,
conversionType TEXT,
conversionSymbol TEXT,
date TEXT
)"""
cursor.execute(table)
cnxn.commit()
# Insert data
col = tuple(df.columns)
for i, value in df.iterrows():
cursor.execute(
f"""
INSERT OR IGNORE INTO {coin}{col}
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
""",
(
value['time'],
value['high'],
value['low'],
value['open'],
value['volumefrom'],
value['volumeto'],
value['close'],
value['conversionType'],
value['conversionSymbol'],
value['date']
)
)
cnxn.commit()
cnxn.close()
如果我現在再次運行代碼,它會得到重復的值和行。這兩列都不是唯一的,并且可能是 PK。嘗試使用df.to_sql(sql, if_exists='append' / 'replace',但這不正確,因為它只會添加重復項或只是洗掉所有舊值并放入新負載。
使用某種插入和選擇似乎是一種選擇,但我不知道如何編碼。一直在尋找這樣的東西,但不知道如何將 DF 用作“表格”?
"""
SELECT date, conversionSymbol
FROM table1 s
WHERE NOT EXISTS
(
SELECT 1
FROM table2 d
WHERE d.open = s.open
)
"""
我覺得我錯過了一些基本的東西,而且很容易解決。有一種“簡單”的方法可以使用 SQL 陳述句來完成這項作業。或者當資料在 Pandas 中時解決方案是不可能的,也許我需要使用像 SQLalchemy 這樣的 ORM,我沒有這方面的經驗。
問題當插入中的某些資料是重復的并且不應該插入并且某些資料是新資料并且應該插入時,將新值插入資料庫的正確方法是什么?
uj5u.com熱心網友回復:
您可以創建基于多列的主鍵 請參見此處Sqlite primary key on multiple columns
或者,您可以基于多個列定義唯一索引。它或多或少是等價的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/510195.html
下一篇:插入的資料未顯示在資料庫中
