Python Sqllite - UPDATE 命令执行但不更新

Python Sqllite - UPDATE command executes but doesn't update

import sqlite3 as sql    
v = (161.5, 164.5, 157.975, 158.5375, 159.3125, 160.325, 74052, 8)

try:
        connection = sql.connect("data.db")
        sql_update_query = """UPDATE RECORDS SET OPEN = ?,HIGH = ?,LOW = ?,CLOSE = ?,LAST = ?,PREVCLOSE = ?,TOTTRDQTY = ? WHERE ROWID = ?"""
        cursor = connection.cursor()
        cursor.execute(sql_update_query,v)
        connection.commit()
        print("Total", cursor.rowcount, "Records updated successfully")
        connection.close()
except Exception as e:
        print(e)

这是我用来更新名为“RECORDS”的 table 数据的代码。

我试图检查我在 DBBrowser 上的 SQL 语句是否有误:

UPDATE RECORDS SET OPEN = 161.5,HIGH = 164.5,LOW = 157.975,CLOSE = 158.5375,LAST = 159.3125,PREVCLOSE = 160.325,TOTTRDQTY = 74052 WHERE ROWID = 8

输出为:

Execution finished without errors.
Result: query executed successfully. Took 2ms, 1 rows affected
At line 1:
UPDATE RECORDS SET OPEN = 161.5,HIGH = 164.5,LOW = 157.975,CLOSE = 158.5375,LAST = 159.3125,PREVCLOSE = 160.325,TOTTRDQTY = 74052 WHERE ROWID = 8

但是当我 运行 我的代码在 python.. 它只是不更新​​。 我得到:

Total 0 Records updated successfully

我的 python 代码 运行s 但数据库没有任何变化。请帮忙。

编辑:29-04-2022: 由于我的代码没有问题,可能是我的数据库创建方式导致了这个问题。

所以我添加了用于创建数据库文件的代码。

import os
import pandas as pd
import sqlite3 as sql
connection = sql.connect("data.db")
d = os.listdir("Bhavcopy/")
for f in d:
    fn = "Bhavcopy/" + f
    df = pd.read_excel(fn)
    df["TIMESTAMP"] = pd.to_datetime(df.TIMESTAMP)
    df["TIMESTAMP"] = df['TIMESTAMP'].dt.strftime("%d-%m-%Y")
    df.rename(columns={"TIMESTAMP":"DATE"},inplace=True)
    df.set_index("DATE",drop=True,inplace=True)
    df['CHANGE'] = df.CLOSE - df.PREVCLOSE
    df['PERCENT'] = round((df.CHANGE/df.PREVCLOSE) * 100, 2)
    df.to_sql('RECORDS', con=connection, if_exists='append')
connection.close()

正在添加到数据库中的数据示例:

       SYMBOL SERIES      OPEN  ...    TIMESTAMP  TOTALTRADES          ISIN
0   20MICRONS     EQ     58.95  ...  01-JAN-2018         1527  INE144J01027
1  3IINFOTECH     EQ      8.40  ...  01-JAN-2018         7133  INE748C01020
2     3MINDIA     EQ  18901.00  ...  01-JAN-2018          728  INE470A01017
3      5PAISA     EQ    383.00  ...  01-JAN-2018          975  INE618L01018
4     63MOONS     EQ    119.55  ...  01-JAN-2018         6628  INE111B01023

[5 rows x 13 columns]
         SYMBOL SERIES     OPEN  ...    TIMESTAMP  TOTALTRADES          ISIN
1412  ZODJRDMKJ     EQ    43.50  ...  01-JAN-2018           10  INE077B01018
1413      ZUARI     EQ   555.00  ...  01-JAN-2018         2097  INE840M01016
1414  ZUARIGLOB     EQ   254.15  ...  01-JAN-2018         1670  INE217A01012
1415  ZYDUSWELL     EQ  1051.00  ...  01-JAN-2018          688  INE768C01010
1416      ZYLOG     EQ     4.80  ...  01-JAN-2018          635  INE225I01026

[5 rows x 13 columns]

excel 个文件的形状:

(1417, 13)

还有人问我是怎么创建的 table:

import sqlite3 as sql
connection = sql.connect("data.db")

cursor = connection.cursor()

#create our table:
command1 = """
    CREATE TABLE IF NOT EXISTS
    RECORDS(
        DATE TEXT NOT NULL,
        SYMBOL TEXT NOT NULL,
        SERIES TEXT NOT NULL,
        OPEN REAL,
        HIGH REAL,
        LOW REAL,
        CLOSE REAL,
        LAST REAL,
        PREVCLOSE REAL,
        TOTTRDQTY INT,
        TOTTRDVAL REAL,
        TOTALTRADES INT,
        ISIN TEXT,
        CHANGE REAL,
        PERCENT REAL
        )
"""

cursor.execute(command1)
connection.commit()
connection.close()

您的代码在 Windows 和 Linux 中都可以正常工作,看到这种行为的唯一原因是您在不同的位置修改两个具有相同名称的文件。检查您的 DBBrowser 中引用的文件。

并且有疑问更喜欢上面评论中的绝对路径

connection = sql.connect("C:/Users/Abinash/Desktop/data.db") 

所以我发现了为什么代码即使正确也无法正常工作的问题。感谢@gimix。

我正在创建变量 v:

v = (161.5, 164.5, 157.975, 158.5375, 159.3125, 160.325, 74052, 8)

通过从数据框中读取它,当每个人都说我的代码是正确的并且当 gimix 询问“我如何创建 table”时,我意识到它可能是数据类型不匹配。检查时发现其中一个值是字符串类型。

所以这个变化:

i = 0
o = float(adjdf['OPEN'].iloc[i])
h = float(adjdf['HIGH'].iloc[i])
l = float(adjdf['LOW'].iloc[i])
c = float(adjdf['CLOSE'].iloc[i])
last = float(adjdf['LAST'].iloc[i])
pc = float(adjdf['PREVCLOSE'].iloc[i])
tq = int(adjdf['TOTTRDQTY'].iloc[i])
did = int(adjdf['ID'].iloc[i])

v = (o,h,l,c,last,pc,tq,did)

这解决了问题。非常感谢大家的帮助。

我终于得到了:

Total 1 Records updated successfully

我创建了您的 table,其中仅包含需要更新的数字字段,运行 您的代码 - 它有效。所以最终它必须是数据类型不匹配,我很高兴你找到它:)