복붙노트

[SQL] 나는 H2는 메모리 데이터베이스의 스키마를 자동 작성 할 수 있습니까?

SQL

나는 H2는 메모리 데이터베이스의 스키마를 자동 작성 할 수 있습니까?

(난 이미 메모리에서 H2 데이터베이스를 본 적이 - 봄 / 최대 절전 모드 질문을 통해 초기화 스키마를, 그것은 여기에 적용되지 않습니다.)

나는에 연결시 스키마를 자동 생성 날 수 있습니다 H2의 설정이 있는지 알고 싶습니다. 도움이된다면, 나는 메모리의 경우에만 관심이 있어요.

H2는 URL의 끝에 다양한 세미콜론으로 구분 된 수정을 지원하지만 자동으로 스키마를 만들기위한 하나를 찾을 수 없습니다. 이러한 기능이 있습니까?

해결법

  1. ==============================

    1.연결할 때 예, H2 지원은 SQL 문을 실행. 당신은 스크립트, 아니면 그냥 문 또는 두 가지를 실행할 수 있습니다 :

    연결할 때 예, H2 지원은 SQL 문을 실행. 당신은 스크립트, 아니면 그냥 문 또는 두 가지를 실행할 수 있습니다 :

    String url = "jdbc:h2:mem:test;" + 
                 "INIT=CREATE SCHEMA IF NOT EXISTS TEST"
    String url = "jdbc:h2:mem:test;" + 
                 "INIT=CREATE SCHEMA IF NOT EXISTS TEST\\;" + 
                      "SET SCHEMA TEST";
    String url = "jdbc:h2:mem;" + 
                 "INIT=RUNSCRIPT FROM '~/create.sql'\\;" + 
                      "RUNSCRIPT FROM '~/populate.sql'";
    

    단지 자바 내에서 요구되는 이중 백 슬래시 (\\) 유의하시기 바랍니다. 백 슬래시 (ES) 전에; 초기화 내에서 필요합니다.

  2. ==============================

    2.당신이 application.yml 봄을 사용하는 경우 다음이 당신을 위해 작동합니다

    당신이 application.yml 봄을 사용하는 경우 다음이 당신을 위해 작동합니다

    봄:   데이터 소스 :     URL : JDBC : H2 : MEM : 여기서 mydb; DB_CLOSE_ON_EXIT = FALSE; MODE = PostgreSQL을, INIT = CREATE SCHEMA IF는 NOT 일정 존재

  3. ==============================

    3.당신은 다음을 사용할 수있는 여러 스키마를 초기화 할 경우 어떻게 토마스가 작성한 것은, 그뿐만 아니라, 올바른 것입니다. 주의점 \\이있다; 분리 두 사람은 문을 만들 수 있습니다.

    당신은 다음을 사용할 수있는 여러 스키마를 초기화 할 경우 어떻게 토마스가 작성한 것은, 그뿐만 아니라, 올바른 것입니다. 주의점 \\이있다; 분리 두 사람은 문을 만들 수 있습니다.

        EmbeddedDatabase db = new EmbeddedDatabaseBuilder()
                        .setType(EmbeddedDatabaseType.H2)
                        .setName("testDb;DB_CLOSE_ON_EXIT=FALSE;MODE=Oracle;INIT=create " +
                                "schema if not exists " +
                                "schema_a\\;create schema if not exists schema_b;" +
                                "DB_CLOSE_DELAY=-1;")
                        .addScript("sql/provPlan/createTable.sql")
                        .addScript("sql/provPlan/insertData.sql")
                        .addScript("sql/provPlan/insertSpecRel.sql")
                        .build();
    

    REF : http://www.h2database.com/html/features.html#execute_sql_on_connection

  4. ==============================

    4."응용 프로그램이 DriverManager.getConnection를 호출 기본 (URL, ...) 아직 존재하지 않는 URL에 지정된 데이터베이스으로 새로운 (빈) 데이터베이스가 생성됩니다."- H2 데이터베이스.

    "응용 프로그램이 DriverManager.getConnection를 호출 기본 (URL, ...) 아직 존재하지 않는 URL에 지정된 데이터베이스으로 새로운 (빈) 데이터베이스가 생성됩니다."- H2 데이터베이스.

    부록 : @Thomas 뮬러 쇼는 어떻게 연결에 SQL을 실행하기 위해,하지만 아래 제안 가끔 그냥 코드에서 생성 웁니다.

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.Statement;
    
    /** @see http://stackoverflow.com/questions/5225700 */
    public class H2MemTest {
    
        public static void main(String[] args) throws Exception {
            Connection conn = DriverManager.getConnection("jdbc:h2:mem:", "sa", "");
            Statement st = conn.createStatement();
            st.execute("create table customer(id integer, name varchar(10))");
            st.execute("insert into customer values (1, 'Thomas')");
            Statement stmt = conn.createStatement();
            ResultSet rset = stmt.executeQuery("select name from customer");
            while (rset.next()) {
                String name = rset.getString(1);
                System.out.println(name);
            }
        }
    }
    
  5. ==============================

    5.표기 : 당신이 application.yml와 스프링 프레임 워크를 사용하고 문제가 발생하면 테스트가 INIT 속성에있는 SQL 파일을 찾을 수 있도록하는 경우에, 당신은 클래스 패스를 사용할 수 있습니다.

    표기 : 당신이 application.yml와 스프링 프레임 워크를 사용하고 문제가 발생하면 테스트가 INIT 속성에있는 SQL 파일을 찾을 수 있도록하는 경우에, 당신은 클래스 패스를 사용할 수 있습니다.

    당신은 SRC / 테스트 / 자원에 init.sql SQL 파일이있는 경우 예를 들어, 단지 사용

    url=jdbc:h2:~/test;INIT=RUNSCRIPT FROM 'classpath:init.sql';DB_CLOSE_DELAY=-1;
    
  6. from https://stackoverflow.com/questions/5225700/can-i-have-h2-autocreate-a-schema-in-an-in-memory-database by cc-by-sa and MIT license