项目启动时,如何根据配置文件,创建数据表?

项目本地开发时新增了数据表,开发完成以后,更新线上项目时,如果没有同步更新线上数据库中的数据表,项目则无法启动,报 Table 'xxxx.xxxx' doesn't exist 错误。

是否可以在项目启动之前或报这个错误之前,检测一下数据库中有哪些表没有创建,没有创建的话,创建一下表;检测一下每个表中应该有的字段都有没有,没有的话就增加一下字段。

求解决方案。



评论区

JFinal

2018-08-30 17:47

用纯 sql 配合 Db.update(sql ) 解决,例如
Db.update("create table. ...")

nbjgl

2018-08-30 19:11

@JFinal 请问在哪里执行?现在项目无法正常启动

nbjgl

2018-08-30 19:12

@JFinal 我问的不是业务逻辑的写法,我现在知道业务逻辑,但是不知道在哪里可以执行它~

nbjgl

2018-08-30 19:16

@JFinal afterJFinalStart()中不行……因为报错,代码还没执行到这里

JFinal

2018-08-30 22:03

在 configConstant(Constants me) 中调用就好

nbjgl

2018-08-30 22:52

@JFinal Config order: constant, plugin, route, engine, interceptor, handler 很明显plugin晚于constant执行,需要在plugin中配置了数据库之后,才可以执行创建表的操作。配置好数据库插件后,再执行_MappingKit.mapping(arp);就会报错。并且plugin执行完了以后,才可以进行数据库操作,否则也会报错。

nbjgl

2018-08-30 22:54

@JFinal 如果在route中调用的话,那么也就意味着不能在plugin中执行_MappingKit.mapping(arp); 那么在route中调用完成以后,将不存在的表创建好以后,怎么再执行一次_MappingKit.mapping(arp) ?

JFinal

2018-08-30 23:12

@nbjgl 在 configPlugin 中的最后,手动调用一下 arp.start() 这样就可以立即启动 ActiveRecordPlugin 了

然后就可以直接 Db.update(...) 了

nbjgl

2018-08-30 23:12

@JFinal

在 configConstant(Constants me) 中调用,执行数据库操作,会抛出异常:
java.lang.NullPointerException
at com.jfinal.plugin.activerecord.Db.query(Db.java:77)

JFinal

2018-08-30 23:12

总之就是找准时机就可以了, ActiveRecordPlugin 这类插件是可以手动 start() 的,调用完就启动

nbjgl

2018-08-31 07:08

@JFinal 就是不太清楚 ActiveRecordPlugin 这个插件怎么手动 start() ,怎么手动start()?

杜福忠

2018-08-31 08:50

@nbjgl http://www.jfinal.com/doc/5-15 new DruidPlugin(...).start();

热门反馈

扫码入社