рдлрдВрдХреНрд╢рдирд▓ рдЯреЗрд╕реНрдЯ рдореЗрдВ PostgreSQL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫрд╣ рдЯрд┐рдкреНрд╕

2018 рдореЗрдВ, рдЕрдХрд╡реЗрд▓рди рдЗрдВрдХ рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ред рдореИрдВрдиреЗ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рд▓рд┐рдпрд╛ред рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рд╕реЗ рдкрд╣рд▓реЗ рдореБрдЭреЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдЙрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдиреЛрдЯрдмреБрдХ рдпрд╛ рдЯреВрдбреВ-рд▓рд┐рд╕реНрдЯ рдЬреИрд╕рд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╡реЗрдм-рдПрдкреНрд▓рд┐рдХреЗрд╢рди - рдмреИрдХ-рдПрдВрдб рдкрд░ рд░рд┐рдПрдХреНрдЯ \ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ, рд╕реА # рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдордПрд╕ SQL тАЛтАЛрд╕рд░реНрд╡рд░ред рдЖрд╡реЗрджрди рдлреИрд╢рдиреЗрдмрд▓ рдерд╛: рдореЛрдЬрд╝реЗрдХ рдкрд░ рдпреВрдирд┐рдЯ-рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдПрдХ рдмрд╣реБрддрд╛рдпрдд рдХреЗ рд╕рд╛рде, рдбреЙрдХрдЯрд░-рдЫрд╡рд┐ рдореЗрдВ рдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ - рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╡реНрдпрдХреНрддрд┐ рдиреЗ рдХреЛрд╢рд┐рд╢ рдХреАред рдФрд░ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЦрд╛рдореА рдереА - рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдкреВрд░реНрдг рд░реВрдк рд╕реЗред рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдирдИ рдкрдВрдХреНрддрд┐ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рд╡рд┐рдлрд▓ред



рдореБрдЭреЗ рдпрд╣ рдорд╛рдорд▓рд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдпрд╛рдж рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдиреЗ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдХрдИ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд┐рдпрд╛ рдерд╛ред


рдЗрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдЧрд▓рдд рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХрд╛ 100% рдХрд╡рд░реЗрдЬ рдпрд╣ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИред


тАУ . , . : , productionтАЩ. , Oracle, H2\HSQLDB, , , production (boolean, group by ).


PostgreSQL 10- 11-. ( ) , .



, : Embedded PostgreSQL Yandex QATools. . :



TestContainers , DockerтАЩ .


otj-pg-embedded. , , HeadHunter DZone. Yandex QATools , otj-pg-embedded Windows MacOS , - . Liquibase Flyway ┬л ┬╗:


abstract class DatabaseAwareTestBase {
    @RegisterExtension
    static final PreparedDbExtension embeddedPostgres =
            EmbeddedPostgresExtension.preparedDatabase(
                    LiquibasePreparer.forClasspathLocation("changelogs/changelog.xml"));
}

GitHub.



. PostgreSQL : , .


, , , , , . , .


. , delete from <table> . truncate. , . truncate , cascade:


truncate table tableA;
truncate table tableB cascade;
truncate table tableE;

, : , :


truncate table tableA, tableB, tableC, tableD, tableE;

cascade, ; . , .



, , , . , 11- Postgres ( 11- , 12-). otj-pg-embedded Zonky, , :


testImplementation enforcedPlatform('io.zonky.test.postgres:embedded-postgres-binaries-bom:11.6.0')
testImplementation 'io.zonky.test:embedded-postgres:1.2.6'

, 100% , .


    @Test
    void checkPostgresVersion() {
        final String pgVersion = jdbcTemplate.queryForObject("select version();", String.class);
        assertThat(pgVersion, startsWith("PostgreSQL 11.6"));
    }


, тАУ . Java-, Linux, . , (, ), CI- , .


SQL


: plain SQL . xml, yml , , . , - \ . xml- psql\pgAdmin тАУ . C plain SQL .


<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
            http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
    <changeSet id="orders_table_create_2020-05-09" author="ivan.vakhrushev">
        <createTable tableName="orders">
            <column name="id" type="BIGINT">
                <constraints nullable="false" primaryKey="true"/>
            </column>
            <column name="shop_id" type="BIGINT">
                <constraints nullable="false"/>
            </column>
            <column name="buyer_id" type="BIGINT">
                <constraints nullable="false"/>
            </column>
            <column name="status" type="VARCHAR(20)">
            <column name="creation_time" type="TIMESTAMP">
                <constraints nullable="false"/>
            </column>
            <column name="update_time" type="TIMESTAMP"/>
        </createTable>
    </changeSet>
</databaseChangeLog>


--liquibase formatted sql
--changeset ivan.vakhrushev:orders_table_create_2020-05-09
create table if not exists orders
(
    id bigint not null primary key,
    shop_id bigint not null,
    buyer_id bigint not null,
    status varchar(20),
    creation_time timestamp not null,
    update_time timestamp
);


. Java 8 Java 11 . Instant\LocalDateTime. PostgreSQL Timestamp , ┬л┬╗ . Java . , ┬л┬╗ . , - :


Timestamp.valueOf(localDateTime.truncatedTo(ChronoUnit.MICROS));
Timestamp.from(instant.truncatedTo(ChronoUnit.MICROS));


. , - .
.


All Articles