Python Sqlite,插入到表中并使所有未指定的值为Null,然后逐个更新Null值

bksxznpy  于 2023-03-03  发布在  SQLite
关注(0)|答案(2)|浏览(184)

我目前正在Python中创建动态sqlite表,这个表的生成过程如下:

year_list = range(start_year, end_year+1)

dbs_to_create = ["Revenue", "Sale", "Rev_Maintenance",...]

for db_name in dbs_to_create:
    concat_string = ""
    for year_used in year_list:
        concat_string += ", '{}' REAL".format(str(year_used))
    
    cursor.execute("CREATE TABLE IF NOT EXISTS {} ( Project_name TEXT PRIMARY KEY{});".format(db_name, concat_string))

完成此操作后,我现在通过以下语句将一个项目插入到表“Revenue”中,然后创建一个行,其中Project_name列的名称为Project 1。(年份范围为2022-2051)现在具有其列标题的值。因此,该行将类似于“项目1,2022,2023,...,2051)。但是,我希望除Project_name之外的所有其他列都保持值Null,直到我再次更新它。这就引出了问题2,下面的代码还包含将列值更新为每年各自收入的语法。然而,尽管语法看起来像“UPDATE Revenue SET '2038' = 50000 WHERE Project_name ='Project 1'”,但当传递到游标.execute时,它仍然不更新Revenue值。

cursor.execute("SELECT * FROM Revenue WHERE Project_name = ?", (project_number,))
                        if cursor.fetchone() is None:
                            cursor.execute("INSERT INTO Revenue (Project_name) VALUES (?);", (project_number,))
                            conn.commit()
                        else:
                            cursor.execute("UPDATE Revenue SET '{}' = {} WHERE Project_name='{}'".format(curr_year, revenue_cell_val, project_number)) 
                            conn.commit()
qhhrdooz

qhhrdooz1#

将您的 insert 语句修改为:

cursor.execute("INSERT INTO Revenue (Project_name, {}) VALUES (?,{})".format(", ".join(year_list), ",?"*len(year_list)), ([project_number] + [None]*len(year_list)))

对于 * 更新 *:

cursor.execute("UPDATE Revenue SET '2038' = ? WHERE Project_name=?", (50000, project_number))

如果有帮助就告诉我

brccelvz

brccelvz2#

提供问题的代码实际上是正确的,结果是Visual Studio代码的SQLite Viewer扩展由于某种原因没有更新值。然而,使用不同的SQL浏览器程序(如HeidiSQL)打开数据库确实会在正确的列中显示正确的值。

相关问题