EasySQL icon indicating copy to clipboard operation
EasySQL copied to clipboard

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

Open Subilan opened this issue 1 year ago • 3 comments

功能简述

我觉得 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 方法,传入的是数据表的结构,可以放在程序的任何位置)。

附加内容

😁

Subilan avatar Jul 07 '24 05:07 Subilan

在 JavaDoc 里找到了 SQLTable 上有这个 getTableName 的方法。 image

Subilan avatar Jul 07 '24 05:07 Subilan

非常感谢您的建议,此刻本项目正在重构中中,您的建议将会在新版本中被参考或(可能被)实现。

新版本中,表结构由现在的String组合语句(即包含了一列所有的信息)变更为独立数据结构,因此,您所提到的快速获取表结构中所有列名可以在新版本中轻松实现; 此外,基于本结构,我已在新版本中考虑支持“AutoMigrate”,但可能会再新版本后的几个版本中实现。

与此同时,非常欢迎您也参与本项目的开发与维护,感谢您对本项目的支持与厚爱!

CarmJos avatar Jul 07 '24 05:07 CarmJos

OK,明白!期待新版本~ Carm 辛苦了~

Subilan avatar Jul 07 '24 06:07 Subilan