Add PostgreSQL support

Therefore add migration scripts and default connection settings. Also
add a draft chapter in the documentation about how to setup the database
. Make HSQLDB the default for integration tests.
This commit is contained in:
2019-03-16 00:04:13 +01:00
parent e9774b3b35
commit aa92718e74
7 changed files with 90 additions and 21 deletions

View File

@@ -10,4 +10,21 @@
3. Overview 3. Overview
4. Architectural overview 4. Architectural overview
5. Account types 5. Account types
6. Booking rules 6. Booking rules
7. Setup
7. Setup
========
This chapter explains how to setup a financer instance. It requires PostgreSQL as a database backend and a Java
Servlet Container (e.g. Apache Tomcat) as a runtime environment.
7.1 Database setup
------------------
First install PostgreSQL. Then create a user for financer:
sudo -iu postgres
createuser --interactive
Enter 'financer' as role name and make it superuser. Then create the actual database:
createdb financer
Naming both, the user and the database, 'financer' is the expected default. If you want any other names you need
to adjust the database connection settings of the financer application.

View File

@@ -1,4 +1,4 @@
spring.flyway.locations=classpath:/database/hsqldb spring.flyway.locations=classpath:/database/hsqldb,classpath:/database/common
# DataSource # DataSource
#spring.datasource.url=jdbc:hsqldb:file:/tmp/financer #spring.datasource.url=jdbc:hsqldb:file:/tmp/financer

View File

@@ -1 +1,7 @@
spring.flyway.locations=classpath:/database/postgres spring.flyway.locations=classpath:/database/postgres,classpath:/database/common
spring.datasource.url=jdbc:postgresql://localhost/financer
spring.datasource.username=financer
# See https://github.com/spring-projects/spring-boot/issues/12007
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true

View File

@@ -0,0 +1,15 @@
-- Accounts
INSERT INTO account ("key", type, status, current_balance)
VALUES ('accounts.checkaccount', 'BANK', 'OPEN', 0);
INSERT INTO account ("key", type, status, current_balance)
VALUES ('accounts.income', 'INCOME', 'OPEN', 0);
INSERT INTO account ("key", type, status, current_balance)
VALUES ('accounts.cash', 'CASH', 'OPEN', 0);
INSERT INTO account ("key", type, status, current_balance)
VALUES ('accounts.start', 'START', 'OPEN', 0);
INSERT INTO account ("key", type, status, current_balance)
VALUES ('accounts.rent', 'EXPENSE', 'OPEN', 0);

View File

@@ -42,20 +42,4 @@ CREATE TABLE "transaction" ( --escape keyword "transaction"
CONSTRAINT fk_transaction_from_account FOREIGN KEY (from_account_id) REFERENCES account (id), CONSTRAINT fk_transaction_from_account FOREIGN KEY (from_account_id) REFERENCES account (id),
CONSTRAINT fk_transaction_to_account FOREIGN KEY (to_account_id) REFERENCES account (id), CONSTRAINT fk_transaction_to_account FOREIGN KEY (to_account_id) REFERENCES account (id),
CONSTRAINT fk_transaction_recurring_transaction FOREIGN KEY (recurring_transaction_id) REFERENCES recurring_transaction (id) CONSTRAINT fk_transaction_recurring_transaction FOREIGN KEY (recurring_transaction_id) REFERENCES recurring_transaction (id)
); );
-- Accounts
INSERT INTO account (id, "key", type, status, current_balance)
VALUES (1, 'accounts.checkaccount', 'BANK', 'OPEN', 0); -- insert first with ID 1 so we get predictable numbering
INSERT INTO account ("key", type, status, current_balance)
VALUES ('accounts.income', 'INCOME', 'OPEN', 0);
INSERT INTO account ("key", type, status, current_balance)
VALUES ('accounts.cash', 'CASH', 'OPEN', 0);
INSERT INTO account ("key", type, status, current_balance)
VALUES ('accounts.start', 'START', 'OPEN', 0);
INSERT INTO account ("key", type, status, current_balance)
VALUES ('accounts.rent', 'EXPENSE', 'OPEN', 0);

View File

@@ -0,0 +1,45 @@
--
-- This file contains the basic initialization of the financer schema and basic init data
--
-- Account table
CREATE TABLE account (
id BIGINT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
"key" VARCHAR(1000) NOT NULL, --escape keyword "key"
type VARCHAR(255) NOT NULL,
status VARCHAR(255) NOT NULL,
current_balance BIGINT NOT NULL,
CONSTRAINT un_account_name_key UNIQUE ("key")
);
-- Recurring transaction table
CREATE TABLE recurring_transaction (
id BIGINT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
from_account_id BIGINT NOT NULL,
to_account_id BIGINT NOT NULL,
description VARCHAR(1000),
amount BIGINT NOT NULL,
interval_type VARCHAR(255) NOT NULL,
first_occurrence DATE NOT NULL,
last_occurrence DATE,
holiday_weekend_type VARCHAR(255) NOT NULL,
CONSTRAINT fk_recurring_transaction_from_account FOREIGN KEY (from_account_id) REFERENCES account (id),
CONSTRAINT fk_recurring_transaction_to_account FOREIGN KEY (to_account_id) REFERENCES account (id)
);
-- Transaction table
CREATE TABLE "transaction" ( --escape keyword "transaction"
id BIGINT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
from_account_id BIGINT NOT NULL,
to_account_id BIGINT NOT NULL,
"date" DATE NOT NULL, --escape keyword "date"
description VARCHAR(1000),
amount BIGINT NOT NULL,
recurring_transaction_id BIGINT,
CONSTRAINT fk_transaction_from_account FOREIGN KEY (from_account_id) REFERENCES account (id),
CONSTRAINT fk_transaction_to_account FOREIGN KEY (to_account_id) REFERENCES account (id),
CONSTRAINT fk_transaction_recurring_transaction FOREIGN KEY (recurring_transaction_id) REFERENCES recurring_transaction (id)
);

View File

@@ -1,3 +1,5 @@
spring.profiles.active=hsqldb,dev
spring.datasource.url=jdbc:hsqldb:mem:. spring.datasource.url=jdbc:hsqldb:mem:.
spring.datasource.username=sa spring.datasource.username=sa
spring.flyway.locations=classpath:/database/hsqldb,classpath:/database/hsqldb/integration spring.flyway.locations=classpath:/database/hsqldb,classpath:/database/hsqldb/integration,classpath:/database/common