Spring boot 初始化數據庫

緣起

最近在用 spring boot 搞單元測試時候需要在測試初始時重建數據庫表結構以及載入一些測試數據,本來打算自己寫個初始化 SQL 的方法,結果發現 spring boot 自身已經提供了此功能。

實現

具體實現可參考 org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer,裏面有兩個方法 createSchemainitSchema

前者可以用來執行 ddl 腳本重建數據庫表結構,後者可以用來初始化一些測試數據,其實二者的實現是基本一樣的,這點區別算是語義上的。

隨便貼點源碼基本就明白了:

	public boolean createSchema() {
		List<Resource> scripts = getScripts("spring.datasource.schema",
				this.properties.getSchema(), "schema");
		if (!scripts.isEmpty()) {
			if (!isEnabled()) {
				logger.debug("Initialization disabled (not running DDL scripts)");
				return false;
			}
			String username = this.properties.getSchemaUsername();
			String password = this.properties.getSchemaPassword();
			runScripts(scripts, username, password);
		}
		return !scripts.isEmpty();
	}

原理很簡單,在配置文件中配置 schemadata 指向相應的 SQL 文件即可,例如 application.yml

spring:
    profiles:
        active: test

    output.ansi.enabled: ALWAYS

    datasource:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/xxx
        username: root
        password: root

        initialization-mode: always
        schema:
            - classpath*:table-drop-ddl.sql
            - classpath*:table-create-ddl.sql

重點是下面幾行,initialization-mode 參見 org.springframework.boot.jdbc.DataSourceInitializationMode,因爲用了第三方連接池,所以這兒需要使用 always

schema 則是指向的初始化 SQL 腳本位置,我這兒是分爲兩個,一個用來刪除表,一個用來創建表。

如果需要初始化數據,則可以使用 data,具體模式與 schema 一致。

額外

如果想要在輸出中查看此操作的詳細日誌,可以類似如下配置:

<logger name="org.springframework.jdbc.datasource.init" level="DEBUG"/>

Over

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章