首页 > 解决方案 > 尝试手动复制 sqlite 行时出现无法识别的令牌错误

问题描述

在 SQLite 中转储一些值时遇到了一些麻烦,因为我已经在代码的其他地方成功实现了相同的结构,所以我不太清楚。基本上,我使用以下结构传递列名和值列表来更新数据库:

def add_data(conn, primary_key, *args: tuple):

    conn.set_trace_callback(print)

    
    # --- Separate columns and values ---
    columns = []
    values = []
    for arg in args:
        columns.append(arg[0])
        values.append(arg[1])
        
    columns.append('timestamp')
    values.append(str(datetime.datetime.now()))
    
    # --- Read the SQL Dataframe ---
    df = pd.read_sql_query("SELECT * FROM projtable ORDER BY ID DESC LIMIT 1;", conn)
    latest_ID = list(df['ID'][-1:])[0]


    # --- Primary Key Does Not Exist:  make a new row ---
    if primary_key == None:
        columns.append('ID')
        values.append(latest_ID + 1)
        exec_text = 'INSERT INTO projtable (' + ','.join(columns) +') values(' + ','.join(['?'] * len(values)) + ')'
        conn.execute(exec_text, values)
        
    
    # --- Primary Key Exists:  update an existing row ---
    else:
    
        exec_text = 'UPDATE projtable SET '
        for col, val in zip(columns, values):
            exec_text += f"`{col}` = ?, "
        exec_text = exec_text[:-2]
        exec_text += f' WHERE ID = {int(primary_key)}'
        conn.execute(exec_text, values)
        
    # --- Commit and Kill ---
    conn.commit()
    
    return 'success'


def add_column(conn, column_name, column_type, default):

    exec_text = f'ALTER TABLE projtable ADD COLUMN {column_name} {column_type} DEFAULT {default}'
    conn.execute(exec_text)
    
    conn.commit()
    
    return 'success'

我正在传递要在此数据库中更新的大量值列表,其中 primary_key 变量设置为 None 以使用以下格式创建新行,该格式到目前为止工作良好:

        status = add_data(
            conn,
            primary_key,
            ('column name 1', value1),
            ('column name 2', value2),
            .
            .
            .
            ('column name x', valuex))

在为一个很长的列表运行代码时,我在列表的最后一行遇到了一个无法识别的令牌错误,该错误引用了一个较早的令牌 - 具体行如下所示:

            ('1_aux_loss', 0.1),

我已经看到列名以数字开头的其他问题,但完全相同的结构在其他代码部分中运行良好,没有问题(我在另一部分代码中以相同的方式更新相同的参数)。我唯一能想到的是,我传递的列表在这里更长,但我很难理解是什么导致了这个错误。基本上我试图在 sqlite 数据库中获取现有行并将一些关键变量(~80)复制到新行。

标签: pythondatabasesqliterowtoken

解决方案


推荐阅读