python做网站还是数据库,泰安刘明是怎么挨办的,wordpress如何正常打开二级菜单,wordpress返回顶部插件前言
前一篇文章说了MogDB适配Halo,【MogDB】将流行的博客系统Halo后端的数据库设置为MogDB,但是适配的是2.x版本#xff0c;由于2.x版本已经引入了对postgresql的支持#xff0c;而MogDB对于postgresql有很好的兼容性#xff0c;因此适配起来很简单。但是由于halo2.x的版本…前言
前一篇文章说了MogDB适配Halo,【MogDB】将流行的博客系统Halo后端的数据库设置为MogDB,但是适配的是2.x版本由于2.x版本已经引入了对postgresql的支持而MogDB对于postgresql有很好的兼容性因此适配起来很简单。但是由于halo2.x的版本进行了全部的重构从1.6版本并不能无痛升到2.x版本所以仍有很多用户在使用1.6版本。又由于Halo1.6版本并未适配postgresql只支持H2和MYSQL两种数据库因此不能像2.x那种适配直接改个数据库连接完事需要对halo的源码进行一些调整本文就记录一下MogDB适配Halo1.6的一些过程。
适配过程
先参考halo官方文档中1.6版本里使用mysql的安装方式把数据库连接进行修改直接启动会报错找不到postgresql的驱动这是因为halo1.6的jar程序并没有打包postgresql的驱动所以还是得下载源码来进行手动修改了
克隆halo1.6的代码
git clone -b release-1.6 https://gitee.com/halo-dev/halo.git打开build.gradle在dependencies里引入jdbc驱动(用runtimeOnly 和implementation应该都行)
implementation io.mogdb:mogdb-jdbc:5.0.0.4.pg然后打包程序再试… 等等貌似没说这个程序要怎么打包其实对于java开发人员来说这个打包很简单我也就简单说下几个步骤具体细节大家自己去搜吧
装jdk环境记得配环境变量装gradle环境记得配环境变量命令行进入项目目录执行 gradle build
打包好了启动程序会发现报错 Flyway Teams Edition or PostgreSQL upgrade required: PostgreSQL 9.2 is no longer supported by Flyway Community Edition Flyway是一个数据库对象版本管理的组件可以用于在应用升级时管理数据库对象的升级。这个报错信息提示Flyway的社区版本已经不支持postgresql 9.2建议改用更高的数据库版本或者使用Flyway Teams版本。 其实这里由于Halo1.6已经停止维护不会再有升级因此我们可以把相关的代码完全去掉
打开.\halo\src\main\java\run\halo\app\listener\StartedListener.java 找到以下代码进行如下注释
public void onApplicationEvent(ApplicationStartedEvent event) {/* try {this.migrate();} catch (SQLException e) {log.error(Failed to migrate database!, e);} */this.initDirectory();this.initThemes();this.printStartInfo();this.configGit();}然后打包再试发现可以成功启动了前台web页面也可以打开。但是在前台页面进行初始化安装时报错了
org.springframework.orm.jpa.JpaSystemException: could not insert: [run.halo.app.model.entity.Post]; nested exception is org.hibernate.exception.GenericJDBCException: could not insert: [run.halo.app.model.entity.Post]
...
Caused by: java.sql.SQLException: Start position [1] cannot exceed overall CLOB length [0]网上查说这是hibernate的bug,但是我觉得不像。这个报错的原因在于halo里对表字段的注解有几个字段加了Lob ,并且又声明了是string因此会把表建成对应数据库的文本大对象类型比如oracle中是clob。但是在postgresql中会建成text这个类型并不是大对象只是长度比较长的字符串类型而已它不需要进行对象的初始化而框架就会认为这是大对象要插空时应该插入空对象插入null就报错了。
于是我们把所有的Lob全部去掉并手动指定这些字段类型为text如果不指定字段类型会变成varchar(255) 长度不够,涉及到6个文件
.\halo\src\main\java\run\halo\app\model\entity\BasePost.java
.\halo\src\main\java\run\halo\app\model\entity\Content.java
.\halo\src\main\java\run\halo\app\model\entity\ContentPatchLog.java
.\src\main\java\run\halo\app\model\entity\Journal.java
.\src\main\java\run\halo\app\model\entity\Option.java
.\src\main\java\run\halo\app\model\entity\ThemeSetting.java以下为一处修改例子
Column(name original_content ,columnDefinition text)//Lobprivate String originalContent;打包运行–正常 在web页面操作初始化–正常 新建文章并保存发布-正常 查看文章–报错主题文件不存在
由于源码中默认的主题目录链接到github的另一个仓库里去了./src/main/resources/templates/themes/anatole 3e7666fgit clone可能没有把相关文件下载下来所以我们打的包里没有主题文件需要手动复制进去这个只要将原始环境中的templates目录覆盖过来,并在后台启用主题即可
完整方案
一、代码修改部分
引入jdbc驱动去掉flyway的使用把Lob都去掉手动指定text类型
二、启动配置文件部分
server:port: 8090# Response data gzip.compression:enabled: false
spring:datasource:driver-class-name: org.postgresql.Driverurl: jdbc:postgresql://127.0.0.1:26050/halo160?stringtypeunspecifiedbatchModeoffusername: halopassword: Halo123jpa:database-platform: org.hibernate.dialect.PostgreSQLDialectproperties:hibernate:temp:use_jdbc_metadata_defaults: falsehalo:# Your admin client path is https://your-domain/{admin-path}admin-path: admin# memory or levelcache: memory
三、数据库部分
创建PG兼容性的库
create database halo160 dbcompatibility PG;\c halo160创建连接用户
create user halo password Halo123 ;四、成品 修改后的代码已上传到我的gitee仓库,欢迎测试和学习和本篇文章内的修改略有不同 https://gitee.com/darkathena/halo/tree/dev-1.6-for-mogdb/ 本文作者 DarkAthena本文链接 https://www.darkathena.top/archives/mogdb-halo160版权声明 本博客所有文章除特别声明外均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处