Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 39ae664

Browse files
committed
add some mysql examples && sql injection protection
1 parent 8192ffd commit 39ae664

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+3138
-475
lines changed

‎Makefile

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
.PHONY : init sqlboiler run all
1+
.PHONY : init sqlboiler sqlc run all
22

33
init:
44
go install github.com/kyleconroy/sqlc/cmd/sqlc@latest
55
go get -u gorm.io/gorm
66
go get -u gorm.io/driver/postgres
7+
go get -u gorm.io/driver/mysql
78
go install github.com/volatiletech/sqlboiler/v4@latest
89
go install github.com/volatiletech/sqlboiler/v4/drivers/sqlboiler-psql@latest
910
go get -d entgo.io/ent/cmd/ent
@@ -12,9 +13,11 @@ init:
1213
sqlboiler:
1314
sqlboiler --output db/sqlboiler/models psql
1415

15-
check: sqlboiler
16-
go generate ./...
16+
sqlc:
1717
sqlc generate
18+
19+
check: sqlboiler sqlc
20+
go generate ./...
1821
go mod tidy
1922
go vet ./...
2023
go fmt ./...

‎README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Examples of using various popular database libraries and ORM in Go.
44

55
- [sqlx](https://jmoiron.github.io/sqlx/)
66
- [sqlc](https://docs.sqlc.dev)
7+
- [squirrel](https://github.com/Masterminds/squirrel)
78
- [Gorm](https://github.com/go-gorm/gorm)
89
- [sqlboiler](https://github.com/volatiletech/sqlboiler)
910
- [ent](https://entgo.io/docs/getting-started)
@@ -14,7 +15,7 @@ The aim is to demonstrate and compare usage for several operations
1415
2. 1-to-Many queries
1516
3. Many-to-many queries
1617
4. Dynamic list filter from query parameter
17-
5. Transaction
18+
5. (Coming) Transaction
1819

1920
# Schema
2021

@@ -35,7 +36,7 @@ Setup postgres database by either running from docker-compose or manually.
3536

3637
This creates both `postgres` database (which this repo uses) and `ent` database which is used by ent ORM.
3738

38-
If you create the database manually, execute the `database/01-schema.sql` script.
39+
If you create the database manually, execute the `database/01-postgres-schema.sql` script.
3940

4041
Default database credentials are defined in `config/config.go`. These can be overwritten by setting environment variables. For example:
4142

‎config/config.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package config
22

33
import (
4+
"log"
5+
6+
"github.com/joho/godotenv"
47
"github.com/kelseyhightower/envconfig"
58
)
69

@@ -9,15 +12,21 @@ type Configuration struct {
912
}
1013

1114
type Database struct {
15+
Type string `default:"postgres"`
1216
Host string `default:"localhost"`
1317
Port int `default:"5432"`
14-
User string `default:"user"`
1518
Name string `default:"db_test"`
19+
User string `default:"user"`
1620
Password string `default:"password"`
1721
SSLMode string `default:"disable"`
1822
}
1923

2024
func New() *Configuration {
25+
err := godotenv.Load()
26+
if err != nil {
27+
log.Println(err)
28+
}
29+
2130
cfg := &Configuration{
2231
DB: DB(),
2332
}

‎database/01-mariadb-schema.sql

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
CREATE TABLE IF NOT EXISTS countries
2+
(
3+
id bigint unsigned not null auto_increment primary key,
4+
code text not null,
5+
name text not null
6+
);
7+
8+
CREATE TABLE IF NOT EXISTS addresses
9+
(
10+
id bigint unsigned not null auto_increment primary key,
11+
line_1 text not null,
12+
line_2 text,
13+
postcode int,
14+
city text,
15+
state text,
16+
country_id bigint unsigned,
17+
18+
constraint addresses_countries_id_fk foreign key(country_id)
19+
references countries(id) ON DELETE CASCADE
20+
);
21+
22+
CREATE TABLE IF NOT EXISTS users
23+
(
24+
id bigint unsigned not null auto_increment primary key,
25+
first_name text not null,
26+
middle_name text,
27+
last_name text not null,
28+
email text not null unique,
29+
password text not null,
30+
favourite_colour enum ('red', 'green', 'blue') not null
31+
);
32+
33+
CREATE TABLE IF NOT EXISTS user_addresses
34+
(
35+
user_id bigint unsigned,
36+
address_id bigint unsigned,
37+
38+
constraint user_addresses_users_id_fk foreign key (user_id)
39+
references users(id) ON DELETE CASCADE,
40+
constraint user_addresses_addresses_id_fk foreign key (address_id)
41+
references addresses(id) ON DELETE CASCADE,
42+
constraint user_addresses_pk
43+
primary key (user_id, address_id)
44+
);
45+
46+
INSERT INTO countries (code, name)
47+
VALUES ('AU', 'Australia');
48+
INSERT INTO countries (code, name)
49+
VALUES ('MY', 'Malaysia');
50+
INSERT INTO countries (code, name)
51+
VALUES ('ID', 'Indonesia');
52+
53+
INSERT INTO addresses (line_1, line_2, postcode, city, state, country_id)
54+
VALUES ('Sydney Opera House', 'Bennelong Point', 2000, 'Sydney', 'NSW', 1);
55+
INSERT INTO addresses (line_1, line_2, postcode, city, state, country_id)
56+
VALUES ('Petronas Twin Towers', '', 50088, 'Kuala Lumpur',
57+
'Wilayah Persekutuan', 2);
58+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
59+
VALUES ('John', 'Doe', 'john@example.com',
60+
'$argon2id$v=19$m=16,t=2,p=1$SHVrWmRXc2tqOW5TWmVrRw$QCPRZ0MmOB/AEEMVB1LudA',
61+
'blue');
62+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
63+
VALUES ('Jane', 'Doe', 'jane@example.com',
64+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
65+
'blue');
66+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
67+
VALUES ('Jake', 'Doe', 'jake@example.com',
68+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
69+
'blue');
70+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
71+
VALUES ('Alice', 'Doe', 'alice@example.com',
72+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
73+
'blue');
74+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
75+
VALUES ('Bob', 'Doe', 'bob@example.com',
76+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
77+
'blue');
78+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
79+
VALUES ('Charlie', 'Doe', 'charlie@example.com',
80+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
81+
'blue');
82+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
83+
VALUES ('Duncan', 'Doe', 'duncan@example.com',
84+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
85+
'blue');
86+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
87+
VALUES ('Eric', 'Doe', 'eric@example.com',
88+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
89+
'blue');
90+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
91+
VALUES ('Finn', 'Doe', 'Finn@example.com',
92+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
93+
'blue');
94+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
95+
VALUES ('Garry', 'Doe', 'garry@example.com',
96+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
97+
'blue');
98+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
99+
VALUES ('Holden', 'Doe', 'holden@example.com',
100+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
101+
'blue');
102+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
103+
VALUES ('Ivy', 'Doe', 'ivy@example.com',
104+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
105+
'blue');
106+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
107+
VALUES ('Jeff', 'Donovan', 'jeff@example.com',
108+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
109+
'blue');
110+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
111+
VALUES ('Bruce', 'Campbell', 'bruce@example.com',
112+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
113+
'blue');
114+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
115+
VALUES ('Gabrielle', 'Anwar', 'gabrielle@example.com',
116+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
117+
'red');
118+
119+
120+
INSERT INTO user_addresses (user_id, address_id)
121+
VALUES (1, 1);
122+
INSERT INTO user_addresses (user_id, address_id)
123+
VALUES (2, 2);
124+
INSERT INTO user_addresses (user_id, address_id)
125+
VALUES (2, 1);
126+
127+
CREATE VIEW country_address as
128+
select c.id,
129+
c.code,
130+
c.name,
131+
(select json_arrayagg(json_object(
132+
a.id, a.line_1, a.line_1, a.postcode, a.city, a.state))
133+
from addresses a
134+
where c.id = a.country_id)
135+
from countries AS c;

‎database/01-postgres-schema.sql

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ CREATE TABLE IF NOT EXISTS addresses
1414
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
1515
line_1 text not null,
1616
line_2 text,
17-
postcode int,
17+
postcode int,
1818
city text,
1919
state text,
2020
country_id bigint
@@ -31,7 +31,7 @@ CREATE TABLE IF NOT EXISTS users
3131
last_name text not null,
3232
email text not null unique,
3333
password text not null,
34-
favourite_colour valid_colours default 'green'::valid_colours null
34+
favourite_colour valid_colours default 'green'::valid_colours not null
3535
);
3636

3737
CREATE TABLE IF NOT EXISTS user_addresses
@@ -58,42 +58,54 @@ VALUES ('Sydney Opera House', 'Bennelong Point', 2000, 'Sydney', 'NSW', 1);
5858
INSERT INTO addresses (line_1, line_2, postcode, city, state, country_id)
5959
VALUES ('Petronas Twin Towers', '', 50088, 'Kuala Lumpur',
6060
'Wilayah Persekutuan', 2);
61-
INSERT INTO users (first_name, last_name, email, password)
61+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
6262
VALUES ('John', 'Doe', 'john@example.com',
63-
'$argon2id$v=19$m=16,t=2,p=1$SHVrWmRXc2tqOW5TWmVrRw$QCPRZ0MmOB/AEEMVB1LudA');
64-
INSERT INTO users (first_name, last_name, email, password)
63+
'$argon2id$v=19$m=16,t=2,p=1$SHVrWmRXc2tqOW5TWmVrRw$QCPRZ0MmOB/AEEMVB1LudA',
64+
'blue');
65+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
6566
VALUES ('Jane', 'Doe', 'jane@example.com',
66-
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg');
67-
INSERT INTO users (first_name, last_name, email, password)
67+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
68+
'blue');
69+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
6870
VALUES ('Jake', 'Doe', 'jake@example.com',
69-
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg');
70-
INSERT INTO users (first_name, last_name, email, password)
71+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
72+
'blue');
73+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
7174
VALUES ('Alice', 'Doe', 'alice@example.com',
72-
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg');
73-
INSERT INTO users (first_name, last_name, email, password)
75+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
76+
'blue');
77+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
7478
VALUES ('Bob', 'Doe', 'bob@example.com',
75-
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg');
76-
INSERT INTO users (first_name, last_name, email, password)
79+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
80+
'blue');
81+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
7782
VALUES ('Charlie', 'Doe', 'charlie@example.com',
78-
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg');
79-
INSERT INTO users (first_name, last_name, email, password)
83+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
84+
'blue');
85+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
8086
VALUES ('Duncan', 'Doe', 'duncan@example.com',
81-
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg');
82-
INSERT INTO users (first_name, last_name, email, password)
87+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
88+
'blue');
89+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
8390
VALUES ('Eric', 'Doe', 'eric@example.com',
84-
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg');
85-
INSERT INTO users (first_name, last_name, email, password)
91+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
92+
'blue');
93+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
8694
VALUES ('Finn', 'Doe', 'Finn@example.com',
87-
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg');
88-
INSERT INTO users (first_name, last_name, email, password)
95+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
96+
'blue');
97+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
8998
VALUES ('Garry', 'Doe', 'garry@example.com',
90-
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg');
91-
INSERT INTO users (first_name, last_name, email, password)
99+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
100+
'blue');
101+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
92102
VALUES ('Holden', 'Doe', 'holden@example.com',
93-
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg');
94-
INSERT INTO users (first_name, last_name, email, password)
103+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
104+
'blue');
105+
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
95106
VALUES ('Ivy', 'Doe', 'ivy@example.com',
96-
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg');
107+
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
108+
'blue');
97109
INSERT INTO users (first_name, last_name, email, password, favourite_colour)
98110
VALUES ('Jeff', 'Donovan', 'jeff@example.com',
99111
'$argon2id$v=19$m=16,t=2,p=1$UDB3RXNPd3ZEWHQ4ZTRNVg$LhHurQuz9Q9dDEG1VNzbFg',
@@ -128,4 +140,6 @@ select c.id,
128140
) addresslist) as address
129141
from countries AS c;
130142

143+
CREATE COLLATION case_insensitive (provider = icu, locale = 'und-u-ks-level2', deterministic = false);
144+
131145
COMMIT;

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /