如何使用 SQLite3 和 Python 在 SQLite table 中更新行

How to do update rows in SQLite table using SQLite3 and Python

我是 python 的新手,我不太了解 sql 的东西。目前是团队树屋的第 6 周,所以如果这些是新手问题,请在这里与我交流。

目标

  1. 导入包含 stock_tickers 和其他 5 列数据的 CSV
  2. 将 CSV 转换为 pandas 数据帧
  3. 将数据框导入数据库。如果已经存在unique stock_ticker 则不添加新行,而是检查其他5列中的数据是否不同。如果是则更新它。

现在我可以完成第 1 步和第 2 步以及第 3 步的一半。在此处的帮助下,能够使循环工作正常进行。如果 csv 中有一个新的 stock_ticker 行,它将把它添加到数据库中。如果现有 stock_ticker 的数据发生变化,它不会进行任何更新。

for i in range(len(df)):
    try:
        df[df.index == i].to_sql(name='stocks', con=conn, if_exists='append', index=False)
        conn.commit()
    except sqlite3.IntegrityError:
        pass

当前代码如下所示

import pandas as pd
from pandas import DataFrame
from pandas import ExcelWriter
import csv
import sqlite3

### IMPORT CSV ###
stock_csv_file = pd.read_csv (r'C:\Users\home\Desktop\code_projects\FIRE_Dashboard\db\alpha_vantage_active_stocks.csv')

### CHANGING INDEX NAMES FROM CSV TO TABLE NAMES ###
df = pd.DataFrame(stock_csv_file)
df = df.rename(columns = {"symbol":"stock_ticker", "name":"stock_name", "exchange":"stock_exchange", "ipoDate":"stock_ipoDate", "delistingDate":"stock_delistingDate", "status":"stock_status"})

### UPDATING DATABSE WITH SQLITE3###
conn = sqlite3.connect('stockmarket.db')
c = conn.cursor()

insert_statement = """
INSERT INTO stocks (stock_ticker,
                    stock_name,
                    stock_exchange,
                    stock_ipoDate,
                    stock_delistingDate,
                    stock_status
                    )
VALUES (?, ?, ?, ?, ?, ?)
ON CONFLICT (stock_ticker) DO UPDATE
    SET (stock_status)"""
    

for i in range(len(df)):
    values = tuple(df.iloc[i])
    c.execute(insert_statement, values)

我遇到的错误

Traceback (most recent call last):
  File "update_stock_tickers.py", line 71, in <module>
    c.execute(insert_statement, values)
sqlite3.OperationalError: incomplete input

找到这些谈论它的帖子,但仍然迷路 >.<

非常感谢任何帮助。


求解后的代码

import pandas as pd
from pandas import DataFrame
from pandas import ExcelWriter
import csv
import sqlite3

### IMPORT CSV ###
stock_csv_file = pd.read_csv (r'C:\Users\home\Desktop\code_projects\FIRE_Dashboard\db\alpha_vantage_active_stocks.csv')

### CHANGING INDEX NAMES FROM CSV TO TABLE NAMES ###
df = pd.DataFrame(stock_csv_file)
df = df.rename(columns = {"symbol":"stock_ticker", "name":"stock_name", "exchange":"stock_exchange", "ipoDate":"stock_ipoDate", "delistingDate":"stock_delistingDate", "status":"stock_status"})

### UPDATING DATABSE WITH SQLITE3###
conn = sqlite3.connect('stockmarket.db')
c = conn.cursor()

insert_statement = """
INSERT INTO stocks (stock_ticker,
                    stock_name,
                    stock_exchange,
                    stock_ipoDate,
                    stock_delistingDate,
                    stock_status
                    )
VALUES (?, ?, ?, ?, ?, ?)
ON CONFLICT (stock_ticker) DO UPDATE
    SET stock_status = EXCLUDED.stock_status"""
    

for i in range(len(df)):
    values = tuple(df.iloc[i])
    c.execute(insert_statement, values)
    conn.commit()

这是您查询的 ON CONFLICT 子句:

ON CONFLICT (stock_ticker) DO UPDATE
    SET (stock_status)

这不是有效的 SQLite 语法。如果你想更新 stock_status 而另一行已经存在相同的 stock_ticker,你可以使用 pseudo-table EXCLUDED 像这样:

INSERT INTO stocks (stock_ticker,
                    stock_name,
                    stock_exchange,
                    stock_ipoDate,
                    stock_delistingDate,
                    stock_status
                    )
VALUES (?, ?, ?, ?, ?, ?)
ON CONFLICT (stock_ticker) DO UPDATE
    SET stock_status = EXCLUDED.status