如何使用SQLite3和Python更新SQLite表中的行

时间:2020-09-14 21:12:44

标签: python pandas sqlite sql-update sql-insert

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

目标

  1. 使用stock_tickers和其他5列数据导入CSV
  2. 将CSV转换为熊猫数据框
  3. 将数据框导入数据库。如果已经存在唯一的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

找到了一些谈论它的帖子,但仍然迷路>。<< / p>

非常感谢您的帮助。


解决方案后的代码

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()

1 个答案:

答案 0 :(得分:1)

这是查询的ON CONFLICT子句:

ON CONFLICT (stock_ticker) DO UPDATE
    SET (stock_status)

这不是有效的SQLite语法。如果要在已经存在具有相同stock_status的另一行时更新stock_ticker,则可以使用伪表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