在某些情况下,ALTER TABLE 无法按预期工作

Posted

技术标签:

【中文标题】在某些情况下,ALTER TABLE 无法按预期工作【英文标题】:ALTER TABLE doesn't work as expected in some cases 【发布时间】:2021-06-15 10:06:19 【问题描述】:

在实现迁移时,如果在添加列之前进行了 select(SELECT * FROM user) 查询(ALTER TABLE user ADD COLUMN simple_name TEXT),那么后续的 select(SELECT * FROM user) 查询不会显示新添加的列

val MIGRATION_1_2: Migration = object : Migration(1, 2) 
    val TAG = "MIGRATION_1_2"

    @SuppressLint("LogNotTimber")
    override fun migrate(database: SupportSQLiteDatabase) 
        var c: Cursor? = null

        try 
            Log.d(TAG, "migrate: running select before ALTER")
            c = database.query("SELECT * FROM user")
            Log.d(TAG, "migrate: columns before ALTER $Arrays.toString(c.columnNames)")
            while (c.moveToNext()) 
            
         finally 
            c?.close()
        

        database.execSQL("ALTER TABLE user ADD COLUMN phone TEXT DEFAULT '' NOT NULL")
        Log.d(TAG, "migrate: executed ALTER TABLE user ADD COLUMN phone TEXT DEFAULT '' NOT NULL")

        try 
            Log.d(TAG, "migrate: running select after ALTER")
            c = database.query("SELECT * FROM user")
            Log.d(TAG, "migrate: columns after ALTER $Arrays.toString(c.columnNames)")

            if (!c.columnNames.contains("phone")) 
                Log.e(TAG, "migrate: ALTER didn't work, phone column not added")
            

            while (c.moveToNext()) 
            
         finally 
            c?.close()
        


        try 
            Log.d(TAG, "migrate: running select again after ALTER")
            c = database.query("SELECT * FROM user")
            Log.d(TAG, "migrate: columns now $Arrays.toString(c.columnNames)")
            if (c.columnNames.contains("phone")) 
                Log.e(TAG, "migrate: ALTER worked after second SELECT query")
            
            while (c.moveToNext()) 
            
         finally 
            c?.close()
        
    

运行 MIGRATION_1_2 打印以下内容

D/MIGRATION_1_2:迁移:在 ALTER 之前运行选择 D/MIGRATION_1_2:迁移:ALTER 之前的列 [id、account_id、用户名、电子邮件] D/MIGRATION_1_2:迁移:执行 ALTER TABLE 用户 ADD COLUMN phone TEXT DEFAULT '' NOT NULL D/MIGRATION_1_2:迁移:在 ALTER 之后运行选择 D/MIGRATION_1_2:迁移:ALTER 之后的列 [id、account_id、用户名、电子邮件]E/MIGRATION_1_2:迁移:ALTER 不起作用,未添加电话列 D/MIGRATION_1_2:迁移:在 ALTER 之后再次运行选择 D/MIGRATION_1_2:迁移:列现在 [id、account_id、用户名、电子邮件、电话]E/MIGRATION_1_2:迁移:ALTER 在第二次 SELECT 查询后工作

【问题讨论】:

【参考方案1】:

Room 2.2 中设置列​​的默认值已更改

看看这个Handle column default value when upgrading to Room 2.2.0

【讨论】:

但是我使用的是 Room 2.1.0,抱歉我没有提到这个问题。 @kr15hna 升级房间版后有没有试过? 我现在试过了,将 Room 版本更改为 2.2.6 从 ALTER 命令中删除了 DEFAULT,也没有实体使用 defaultValue 属性。问题依然存在。 另外,我正在使用 Room 的 MigrationTestHelper 对此进行测试,并且表格中的行数为零。

以上是关于在某些情况下,ALTER TABLE 无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬承诺在某些条件下无法解决

在 ELEMENT_NODE 的情况下,node.getNodeType 无法按预期工作

SQL ALTER TABLE 语句

Python Fetchone 无法按预期工作

Flyway 是不是可以在需要使用 ALTER TABLE 进行迁移时备份和恢复数据?

显示对话框 onCompleted 无法按预期工作