提供网站空间服务器,显示危险网站怎么解决,温州网页制作招聘,如何做adsense网站文章目录 业务场景参数介绍initSqlsbaselineOnMigratebaselineVersiontargetvalidateOnMigrate SQL注意事项 业务场景
对于生产环境#xff0c;随着项目版本迭代#xff0c;数据库结构也会变动。如果一个项目在多个地方实施部署#xff0c;且版本不一致#xff0c;就需要一… 文章目录 业务场景参数介绍initSqlsbaselineOnMigratebaselineVersiontargetvalidateOnMigrate SQL注意事项 业务场景
对于生产环境随着项目版本迭代数据库结构也会变动。如果一个项目在多个地方实施部署且版本不一致就需要一个方法来管理数据库结构。flyway是个简单易用的轻量级数据库版本管理工具可以让我们像使用 Git 管理代码一样对数据库版本和变动进行详细的记录使用flyway时我们按照版本整理数据库SQL脚本当发布新的项目版本时同时发布SQL变动文件举例说明对于第一个正式版本我们的SQL文件包含数据库表初始化SQL数据的初始化SQL对于第二个版本我们需要数据库表结构变动的SQL。每一个SQL文件都带有版本号在各地实施时会根据基础版本号和schema表里记录的情况自动进行数据库结构校验和更新保持表结构一致。对于新部署的项目没有数据可以不指定初始版本直接从第一个数据库脚本开始执行创建数据库初始化数据一直更新到需要的版本对于已经在运行的项目数据库是已有的里面也有客户的数据不需要走创建数据库和初始化数据的过程。这时候需要设置基础版本的版本号在进行表结构更新时就会忽略之前的版本的SQL文件只执行需要更新的SQL文件
参数介绍
我的flyway的在spring boot应用里的application.yml配置
spring:datasource:type: com.zaxxer.hikari.HikariDataSourceurl: jdbc:postgresql://192.168.x.xx:5432/coreusername: xxxpassword: xxxxxxxhikari:poolName: Hikariauto-commit: falseflyway:enabled: trueschemas: publicencoding: UTF-8locations: classpath:db/migrationsql-migration-prefix: Vsql-migration-separator: __sql-migration-suffixes: .sqltable: flyway_schema_historybaseline-on-migrate: truevalidate-on-migrate: truebaseline-version: 2.0.0.1enabled默认true是否启用flyway设置为trueflyway才会生效locations默认classpath:db/migration迁移脚本的位置schemas由 Flyway 管理的schema的名称区分大小写encoding默认UTF_8SQL 迁移的编码table默认flyway_schema_historyFlyway 将使用的架构历史表的名称。sqlMigrationPrefix默认VSQL 迁移的文件名前缀sqlMigrationSuffixes默认.sqlSQL 迁移的文件名后缀sqlMigrationSeparator默认__SQL 迁移的文件名分隔符repeatableSqlMigrationPrefix默认R可重复 SQL 迁移的文件名前缀cleanDisabled是否禁用数据库清理cleanOnValidationError验证错误时是否自动调用cleanbaselineVersion默认1执行基线时用于标记现有模式的版本target应考虑迁移到的目标版本initSqls获取连接后立即执行初始化连接的 SQL 语句baselineOnMigrate迁移非空schema时是否自动调用基线validateMigrationNaming默认false是否验证脚本不遵守正确命名约定的迁移和回调validateOnMigrate默认true执行迁移时是否自动调用validate下面对于我有使用经验的个人认为比较重要的几个参数详细讲一下。
initSqls
对于初次部署的系统可以使用flyway新建表和初始化数据但是没法新建库一开始想用init-sqls参数建库发现不行一方面在数据库连接参数url里就要指定库名了如果这时候库还没创建连接这个库的时候就会报错了也不会进行下去另一方面postgresql不支持create xx if not exists的用法没法判断库不存在再去创建initSqls参数可以指定一些SQL语句获取连接后立即执行初始化连接的 SQL 语句我没有需要在连接后执行SQL语句的场景暂时未使用此参数
baselineOnMigrate
baseline-on-migrate参数迁移非空schema时是否自动调用基线主要是指数据库已存在已经有数据库表和数据此时开始使用flyway管理数据库的场景此时flyway_schema_history表不存在schema一般默认都是public为空时baseline-on-migrate参数就没有意义了为空就直接走创建过程了维护表结构时会首先创建flyway_schema_history表再去逐个执行SQL脚本在判断schema一般默认都是public非空时设值为falseflyway_schema_history表不存在就返回报错 在判断schema一般默认都是public非空时设置为true会去创建flyway_schema_history表然后按照版本号逐个执行SQL文件
baselineVersion
baseline-version参数指定基础版本只有大于这个版本的SQL文件才会被检查和执行需要注意的是只有在flyway_schema_history表不存在时baseline-version参数才会生效 当flyway_schema_history表存在时会根据表里的记录继续进行升级baseline-version参数没有意义当schema表存在但表内容为空时baseline-version参数同样没有意义会根据locations的SQL文件逐个版本升级直到最新或者target版本
target
默认是迁移到最新版本不配置时就会根据locations的SQL文件逐个版本升级一直到全部文件执行完成如果指定版本号则迁移到该版本后续版本不升级
validateOnMigrate
默认true执行迁移时自动调用validate对SQL文件进行校验如果已有flyway_schema_history会对里面的记录逐个校验checksum字段的值每个文件会根据文件信息生成一个 checksum 值flyway在SQL文件执行时会在表里插入一条记录包含checksum值当已经同步过的SQL文件发生变动时 checksum 值就会和数据库里的记录对应不上就会校验失败
SQL注意事项
保证SQL能正确执行可以多加些判断建表语句新增字段的语句可以多加一个IF NOT EXISTS
CREATE TABLE IF NOT EXISTS public.sys_log
(id int8 NOT NULL,op_desc varchar(255) COLLATE pg_catalog.default,op_time timestamp(6),CONSTRAINT sys_log_pkey PRIMARY KEY (id)
);ALTER TABLE public.sys_setting ADD COLUMN IF NOT EXISTS enable_scheme_review bool NOT NULL DEFAULT false;删除语句可以多加一个IF EXISTS
ALTER TABLE public.wireless_security DROP COLUMN IF EXISTS dev_no;
ALTER TABLE public.bayonet DROP CONSTRAINT IF EXISTS fk_bayonet__intersection_id;postgresql不支持create xx if not exists的用法如果是增加外键、唯一键等操作可以尝试先删除后新增保证SQL一定执行成功
ALTER TABLE public.vip_traffic_movement DROP CONSTRAINT IF EXISTS fk_vip_traffic_movement__vip_route_config_id;
ALTER TABLE public.vip_traffic_movement ADD CONSTRAINT fk_vip_traffic_movement_vip_route_config_id FOREIGN KEY (vip_route_config_id) REFERENCES public.vip_route_config (id) ON DELETE NO ACTION ON UPDATE NO ACTION;