Skip to content

feat(table): 数据表结构优化与自动migrate #135

@Subilan

Description

@Subilan

功能简述

我觉得 EasySQL 已经做的非常完善了,以下是我个人在开发过程中遇到的一些疑问,这些功能可能已经存在(?)。

  1. 获取数据库的全部(或者部分)表名(更进一步地,表的详细信息等等,如有可能)的方法。
  2. 数据表目前似乎没有自动合并功能,当后期修改表的定义(例如增添列、删除列或者改动列)时,数据表没有相应的反映。

需求来源

在执行 select、insert 等操作的时候,有时会遇到对许多表名的操作,例如 select * 或者 insert 一大堆表名,这个时候 setColumnNames 方法似乎就会有些繁琐。鉴于其参数是 String[],是否有方法可以获取到这样的 String[] 呢?

是否可以用 * 等等特殊符号来代替一个包含所有表名的数组呢?这个我并没有试过,或许是可以的。

⬆️这个想法可能不太好,因为 insert * 不符合经典 SQL 语法,所以...

我按照 https://github.com/CarmJos/EasySQL/blob/master/.documentation/USAGE-TABLE.md 这里给出的方式定义了数据表,按照我对 Enum 的语义理解,访问到这些表枚举项例如 DataTables.ExampleTable 时如果能够提供更多关于这张表的元信息是最好,但是目前并没有信息途径(除了,当特别约定数据表名就是枚举项 name 的 lowercase 时候,可以自行编写出 getTableName() 方法,但并没有广泛做法)。

关于第二点,维护的过程难免会出现数据表的微小变动,如果有 auto-migration 会使这个过程方便许多。对于用户端来说,如果没有 auto-migration 则需要自己编写 ALTER TABLE 语句并在合适的时机执行来避免新版本运行过程中出现问题。

功能参考(可选)

第一个功能是我自己脑补出来的,所以没啥参考。Enum 实现出来后的代码可能是这样的:

 manager.createInsert(DataTables.ExampleTable.getTableName())
        .setColumnNames(DataTables.ExampleTable.getTableColumnsAsStringArray())
// ...

问题在于这些方法的数据来源是否存在。

第二个功能是在一些其它的 ORM 中见到的功能,例如 GORM https://gorm.io/zh_CN/docs/index.html ,具体表现就是在每次 initialize 的时候先前对数据表定义的改动都会反映到数据表里,这个过程大概是在执行 createTable 的过程中,对 addColumn 添加的 column 的特殊处理吧(GORM 的设计是一个独立的 AutoMigrate 方法,传入的是数据表的结构,可以放在程序的任何位置)。

附加内容

😁

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions