如何在使用新列升级表模式时使SELECT查询工作

How to make SELECT query work when the table schema is upgraded with a new column?

本文关键字:模式 SELECT 查询 工作 新列升      更新时间:2023-09-26

我正在做一个JavaScript项目,它有一个现有的数据库(因此有一个现有的模式)。

要添加一个新特性,我必须在表中添加一个新列。这将存储一个类的对象的属性。

当前项目中有一个SELECT查询,每次应用程序启动时都会从数据库表中查询一堆字段,然后将这些获得的结果放入所需的各种JavaScript对象中。

那么,现在它看起来像:

let FIELDS = "field1, field2, field3";
let query = "SELECT " + FIELDS + "FROM FOO_TABLE";

在其他地方,这个查询是在需要时进行的(通常在应用程序重启后)。

我想改成:

let FIELDS = "field1, field2, field3, new_prop";

但是在当前表中不起作用,这样的表不存在。(也许在下次重启后,事情会工作,但不是第一次)。

解决方法是什么?此外,请注意,静默更改将比显示该属性是new对每个处理该文件的人更好。

你不能只在查询中添加字段,这是行不通的,所以你有两个选择。

  1. 使用异常/错误来确定是否出了问题。我不是一个sqlite大师(事实上我从来没有直接使用过sqlite,总是通过API与ios开发),但如果你试图运行一个查询包含一个不存在的列名,有些东西会出错,你可以捕获,找出错误代码/字符串,并决定重新运行查询减去坏列。

这不是一个好主意,它既脏又贵。我已经使用异常来保存欺骗检查查询的过去,但即使这不是正确的方式去做的事情…

  1. 做你想做的唯一"正确"的方法是首先检查列是否存在。在sqlite,我不认为有一个简单的选择命令,就像在mysql。但是您可以使用PRAGMA table_info('table-name')语句获取所有列,然后在运行查询之前检查您的列是否存在。这是正确的做法。

话虽如此,如果你在一个协作/团队开发环境中工作,你应该有一个更清晰的方式来升级小组中的每个人。因此,我更倾向于解决过程的问题,而不是围绕它编写代码。