From 8b51af2e405f0b49cd0cb9af881838cb81d7d98b Mon Sep 17 00:00:00 2001 From: liangfujian <50279811+liangfujian@users.noreply.github.com> Date: Wed, 30 Aug 2023 10:54:18 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dstring()=E7=BC=96?= =?UTF-8?q?=E8=AF=91=E9=94=99=E8=AF=AF=20#47?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- generator/client/golang/templates/[model].gotmpl | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/generator/client/golang/templates/[model].gotmpl b/generator/client/golang/templates/[model].gotmpl index 3ce2af55..4bfe0bf4 100644 --- a/generator/client/golang/templates/[model].gotmpl +++ b/generator/client/golang/templates/[model].gotmpl @@ -31,23 +31,23 @@ type {{ $.model.Name }} struct { // String implements the stringer interface. func ({{ $m }} *{{.model.Name}}) String() string { - var b strings.Builder - b.WriteString("({{ $.model.Name }} ") + var str strings.Builder + str.WriteString("({{ $.model.Name }} ") {{- range $i, $c := $.model.Columns }} {{- if $c.Null }} - b.WriteString(fmt.Sprintf("{{ $c.Name }}: %s", {{ $m }}.{{ pascal $c.Name }})) + str.WriteString(fmt.Sprintf("{{ $c.Name }}: %s", {{ $m }}.{{ pascal $c.Name }})) {{- else if eq $c.Type "string" }} - b.WriteString(fmt.Sprintf(`{{ $c.Name }}: "%s"`, {{ $m }}.{{ pascal $c.Name }})) + str.WriteString(fmt.Sprintf(`{{ $c.Name }}: "%s"`, {{ $m }}.{{ pascal $c.Name }})) {{- else }} - b.WriteString(fmt.Sprintf("{{ $c.Name }}: %v", {{ $m }}.{{ pascal $c.Name }})) + str.WriteString(fmt.Sprintf("{{ $c.Name }}: %v", {{ $m }}.{{ pascal $c.Name }})) {{- end }} {{- $l := len $.model.Columns }} {{- if ne $i (sub $l 1) }} - b.WriteString(", ") + str.WriteString(", ") {{- end }} {{- end }} - b.WriteString(")") - return b.String() + str.WriteString(")") + return str.String() } func ({{ $m }} *{{.model.Name}}) applyChange(change *queryx.{{.model.Name}}Change) error { From 6431669729e78018a8d0558d243d1f48b72c7ebf Mon Sep 17 00:00:00 2001 From: liangfujian <50279811+liangfujian@users.noreply.github.com> Date: Wed, 30 Aug 2023 10:59:11 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=90=8D=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- generator/client/golang/templates/[model].gotmpl | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/generator/client/golang/templates/[model].gotmpl b/generator/client/golang/templates/[model].gotmpl index 4bfe0bf4..f3106b6c 100644 --- a/generator/client/golang/templates/[model].gotmpl +++ b/generator/client/golang/templates/[model].gotmpl @@ -31,23 +31,23 @@ type {{ $.model.Name }} struct { // String implements the stringer interface. func ({{ $m }} *{{.model.Name}}) String() string { - var str strings.Builder - str.WriteString("({{ $.model.Name }} ") + var sb strings.Builder + sb.WriteString("({{ $.model.Name }} ") {{- range $i, $c := $.model.Columns }} {{- if $c.Null }} - str.WriteString(fmt.Sprintf("{{ $c.Name }}: %s", {{ $m }}.{{ pascal $c.Name }})) + sb.WriteString(fmt.Sprintf("{{ $c.Name }}: %s", {{ $m }}.{{ pascal $c.Name }})) {{- else if eq $c.Type "string" }} - str.WriteString(fmt.Sprintf(`{{ $c.Name }}: "%s"`, {{ $m }}.{{ pascal $c.Name }})) + sb.WriteString(fmt.Sprintf(`{{ $c.Name }}: "%s"`, {{ $m }}.{{ pascal $c.Name }})) {{- else }} - str.WriteString(fmt.Sprintf("{{ $c.Name }}: %v", {{ $m }}.{{ pascal $c.Name }})) + sb.WriteString(fmt.Sprintf("{{ $c.Name }}: %v", {{ $m }}.{{ pascal $c.Name }})) {{- end }} {{- $l := len $.model.Columns }} {{- if ne $i (sub $l 1) }} - str.WriteString(", ") + sb.WriteString(", ") {{- end }} {{- end }} - str.WriteString(")") - return str.String() + sb.WriteString(")") + return sb.String() } func ({{ $m }} *{{.model.Name}}) applyChange(change *queryx.{{.model.Name}}Change) error { From 984f61fd24647f7d07ff5e5299d6b67b97554d6c Mon Sep 17 00:00:00 2001 From: liangfujian <50279811+liangfujian@users.noreply.github.com> Date: Fri, 1 Sep 2023 22:15:42 +0800 Subject: [PATCH 3/7] test migrate (#52) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 测试mysql,posgresql迁移 * fix migrate.yml * fix migrate.yml * fmt migrate.yml * 修复pg迁移测试 * 修复mysql迁移测试 * fix migrate.yml * mysql 指定数据库 * pg 指定地址 * pg显式指定数据库 * [skip ci] fmt --------- Co-authored-by: Wang Zuo --- .github/workflows/migrate.yml | 101 ++++++++++++++++++++++++++++++- internal/migrate/mysql1.hcl | 15 +++++ internal/migrate/mysql2.hcl | 18 ++++++ internal/migrate/postgresql1.hcl | 15 +++++ internal/migrate/postgresql2.hcl | 18 ++++++ 5 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 internal/migrate/mysql1.hcl create mode 100644 internal/migrate/mysql2.hcl create mode 100644 internal/migrate/postgresql1.hcl create mode 100644 internal/migrate/postgresql2.hcl diff --git a/.github/workflows/migrate.yml b/.github/workflows/migrate.yml index 1a5244d8..47106d65 100644 --- a/.github/workflows/migrate.yml +++ b/.github/workflows/migrate.yml @@ -1,15 +1,32 @@ name: migrate on: push jobs: - sqlite: + build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-go@v3 with: go-version: 1.19 - - name: build + - name: Build run: go build -o /usr/local/bin/queryx cmd/queryx/main.go + - uses: actions/upload-artifact@v3 + with: + name: bin + path: /usr/local/bin/queryx + sqlite: + needs: [build] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v3 + with: + go-version: 1.19 + - uses: actions/download-artifact@v3 + with: + name: bin + path: /usr/local/bin + - run: chmod a+x /usr/local/bin/queryx - name: migrate run: | cd internal/migrate @@ -24,3 +41,83 @@ jobs: run: | cd internal/migrate sqlite3 test.sqlite3 "insert into users(name, email) values('test', 'test@example.com')" + postgresql: + needs: [build] + runs-on: ubuntu-latest + services: + postgres: + image: postgres:14.2 + env: + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + POSTGRES_DB: queryx_test + ports: + - 5432:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v3 + with: + go-version: 1.19 + - uses: actions/download-artifact@v3 + with: + name: bin + path: /usr/local/bin + - run: chmod a+x /usr/local/bin/queryx + - name: migrate + run: | + cd internal/migrate + queryx db:migrate --schema postgresql1.hcl + - name: sleep + run: sleep 1 + - name: migrate again + run: | + cd internal/migrate + queryx db:migrate --schema postgresql2.hcl + - name: test + run: | + PGPASSWORD=postgres psql -h localhost -U postgres -d queryx_test -tc "insert into users(name, email) values('test', 'test@example.com')" + mysql: + needs: [build] + runs-on: ubuntu-latest + services: + mysql: + image: mysql:8.0.32 + env: + MYSQL_DATABASE: queryx_test + MYSQL_ALLOW_EMPTY_PASSWORD: true + ports: + - 3306:3306 + options: >- + --health-cmd "mysqladmin ping -uuser_test -pqueryx_test" + --health-interval 10s + --health-start-period 10s + --health-timeout 5s + --health-retries 10 + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v3 + with: + go-version: 1.19 + - uses: actions/download-artifact@v3 + with: + name: bin + path: /usr/local/bin + - run: chmod a+x /usr/local/bin/queryx + - name: migrate + run: | + cd internal/migrate + queryx db:migrate --schema mysql1.hcl + - name: sleep + run: sleep 1 + - name: migrate again + run: | + cd internal/migrate + queryx db:migrate --schema mysql2.hcl + - name: test + run: | + mysql --protocol=tcp -h localhost -u root -D queryx_test -e "insert into users(name, email) values('test', 'test@example.com')" diff --git a/internal/migrate/mysql1.hcl b/internal/migrate/mysql1.hcl new file mode 100644 index 00000000..b285bdec --- /dev/null +++ b/internal/migrate/mysql1.hcl @@ -0,0 +1,15 @@ +database "db" { + adapter = "mysql" + + config "development" { + url = "mysql://root:@127.0.0.1:3306/queryx_test" + } + + model "User" { + timestamps = false + + column "name" { + type = string + } + } +} diff --git a/internal/migrate/mysql2.hcl b/internal/migrate/mysql2.hcl new file mode 100644 index 00000000..582b404e --- /dev/null +++ b/internal/migrate/mysql2.hcl @@ -0,0 +1,18 @@ +database "db" { + adapter = "mysql" + + config "development" { + url = "mysql://root:@127.0.0.1:3306/queryx_test" + } + + model "User" { + timestamps = false + + column "name" { + type = string + } + column "email" { + type = string + } + } +} diff --git a/internal/migrate/postgresql1.hcl b/internal/migrate/postgresql1.hcl new file mode 100644 index 00000000..2221eb5b --- /dev/null +++ b/internal/migrate/postgresql1.hcl @@ -0,0 +1,15 @@ +database "db" { + adapter = "postgresql" + + config "development" { + url = "postgresql://postgres:postgres@localhost:5432/queryx_test?sslmode=disable" + } + + model "User" { + timestamps = false + + column "name" { + type = string + } + } +} diff --git a/internal/migrate/postgresql2.hcl b/internal/migrate/postgresql2.hcl new file mode 100644 index 00000000..38400d27 --- /dev/null +++ b/internal/migrate/postgresql2.hcl @@ -0,0 +1,18 @@ +database "db" { + adapter = "postgresql" + + config "development" { + url = "postgresql://postgres:postgres@localhost:5432/queryx_test?sslmode=disable" + } + + model "User" { + timestamps = false + + column "name" { + type = string + } + column "email" { + type = string + } + } +} From 30da020321a4fb2ca0915d6215a8c713764685d9 Mon Sep 17 00:00:00 2001 From: liangfujian <50279811+liangfujian@users.noreply.github.com> Date: Sat, 16 Sep 2023 16:07:47 +0800 Subject: [PATCH 4/7] Support MySQL password settings (#57) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 支持mysql设置密码 #56 * fix gitaction * fix gitaction --- adapter/config.go | 2 +- adapter/config_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/adapter/config.go b/adapter/config.go index 5d762d25..94693089 100644 --- a/adapter/config.go +++ b/adapter/config.go @@ -72,7 +72,7 @@ func (c *Config) GoFormat() string { u = fmt.Sprintf("postgres://%s:%s@%s:%s/%s", c.Username, c.Password, c.Host, c.Port, c.Database) case "mysql": c.Options.Set("parseTime", "true") - u = fmt.Sprintf("%s@tcp(%s:%s)/%s", c.Username, c.Host, c.Port, c.Database) + u = fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", c.Username, c.Password, c.Host, c.Port, c.Database) case "sqlite": return fmt.Sprintf("file:%s", c.Database) default: diff --git a/adapter/config_test.go b/adapter/config_test.go index b4aca7f4..a11fc997 100644 --- a/adapter/config_test.go +++ b/adapter/config_test.go @@ -33,8 +33,8 @@ func TestNewMySQLConfig(t *testing.T) { require.Equal(t, "localhost", c.Host) require.Equal(t, "3306", c.Port) require.Equal(t, "queryx_test", c.Database) - require.Equal(t, "root@tcp(localhost:3306)/queryx_test?parseTime=true", c.URL) - require.Equal(t, "root@tcp(localhost:3306)/?parseTime=true", c.URL2) + require.Equal(t, "root:@tcp(localhost:3306)/queryx_test?parseTime=true", c.URL) + require.Equal(t, "root:@tcp(localhost:3306)/?parseTime=true", c.URL2) require.Equal(t, "mysql://root:@localhost:3306/queryx_test?parseTime=true", c.TSFormat()) } From 62b77e2d4699afce061596f7b2154e82f06b54e1 Mon Sep 17 00:00:00 2001 From: liangfujian <50279811+liangfujian@users.noreply.github.com> Date: Sat, 16 Sep 2023 16:34:23 +0800 Subject: [PATCH 5/7] fix date in query (#59) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 修复date类型数据查询与实际结果不符错误 * improve testing * add ts testing for date in query --------- Co-authored-by: Wang Zuo --- .../client/golang/templates/queryx/date_column.gotmpl | 10 +++++----- internal/integration/client.test.ts | 3 +++ internal/integration/client_test.go | 4 ++++ 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/generator/client/golang/templates/queryx/date_column.gotmpl b/generator/client/golang/templates/queryx/date_column.gotmpl index cff049d7..ca85ef14 100644 --- a/generator/client/golang/templates/queryx/date_column.gotmpl +++ b/generator/client/golang/templates/queryx/date_column.gotmpl @@ -27,7 +27,7 @@ func (c *DateColumn) EQ(v string) *Clause { } return &Clause{ fragment: fmt.Sprintf("%s.%s = ?", c.Table.Name, c.Name), - args: []interface{}{d.UTC()}, + args: []interface{}{d}, err: err, } } @@ -41,7 +41,7 @@ func (c *DateColumn) LE(v string) *Clause { } return &Clause{ fragment: fmt.Sprintf("%s.%s <= ?", c.Table.Name, c.Name), - args: []interface{}{d.UTC()}, + args: []interface{}{d}, err: err, } } @@ -55,7 +55,7 @@ func (c *DateColumn) LT(v string) *Clause { } return &Clause{ fragment: fmt.Sprintf("%s.%s <=?", c.Table.Name, c.Name), - args: []interface{}{d.UTC()}, + args: []interface{}{d}, err: err, } } @@ -69,7 +69,7 @@ func (c *DateColumn) GE(v string) *Clause { } return &Clause{ fragment: fmt.Sprintf("%s.%s >= ?", c.Table.Name, c.Name), - args: []interface{}{d.UTC()}, + args: []interface{}{d}, err: err, } } @@ -83,7 +83,7 @@ func (c *DateColumn) GT(v string) *Clause { } return &Clause{ fragment: fmt.Sprintf("%s.%s > ?", c.Table.Name, c.Name), - args: []interface{}{d.UTC()}, + args: []interface{}{d}, err: err, } } diff --git a/internal/integration/client.test.ts b/internal/integration/client.test.ts index b6a4a56f..10819bc0 100644 --- a/internal/integration/client.test.ts +++ b/internal/integration/client.test.ts @@ -106,6 +106,9 @@ test("time", async () => { test("date", async () => { let user = await c.queryUser().create({ date: "2012-11-10" }); expect(format(user.date!, "yyyy-MM-dd")).toEqual("2012-11-10"); + + user = await c.queryUser().where(c.userDate.eq("2012-11-10")).first(); + expect(format(user.date!, "yyyy-MM-dd")).toEqual("2012-11-10"); }); test("datetime", async () => { diff --git a/internal/integration/client_test.go b/internal/integration/client_test.go index 2e3474e6..52fff47b 100644 --- a/internal/integration/client_test.go +++ b/internal/integration/client_test.go @@ -157,6 +157,10 @@ func TestDate(t *testing.T) { user, err := c.QueryUser().Create(c.ChangeUser().SetDate("2012-11-10")) require.NoError(t, err) require.Equal(t, "2012-11-10", user.Date.Val.Format("2006-01-02")) + + user, err = c.QueryUser().Where(c.UserDate.EQ("2012-11-10")).First() + require.NoError(t, err) + require.Equal(t, "2012-11-10", user.Date.Val.Format("2006-01-02")) } func TestDatetime(t *testing.T) { From 1734849da0363cbc06a09fe9438abd267a9b5f24 Mon Sep 17 00:00:00 2001 From: Wang Zuo Date: Sat, 16 Sep 2023 16:35:27 +0800 Subject: [PATCH 6/7] bump version --- cmd/queryx/action/version.go | 2 +- install.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/queryx/action/version.go b/cmd/queryx/action/version.go index f58d97ff..b404abf8 100644 --- a/cmd/queryx/action/version.go +++ b/cmd/queryx/action/version.go @@ -6,7 +6,7 @@ import ( "github.com/spf13/cobra" ) -var Version = "0.2.4" +var Version = "0.2.5" var versionCmd = &cobra.Command{ Use: "version", diff --git a/install.sh b/install.sh index 1e58f51d..c9f260cc 100644 --- a/install.sh +++ b/install.sh @@ -151,7 +151,7 @@ start() { pkg="github.com/swiftcarrot/queryx" bin="queryx.tar.gz" - version="v0.2.4" + version="v0.2.5" prefix=${PREFIX:-"/usr/local/bin"} tmp="$(mktmpdir)" From 728e1e4557897a25b06f78e0ca267a3cda88a9ca Mon Sep 17 00:00:00 2001 From: Wang Zuo Date: Sat, 16 Sep 2023 16:39:52 +0800 Subject: [PATCH 7/7] Update README_zh.md --- README_zh.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_zh.md b/README_zh.md index 5b4fe89c..243f8bd2 100644 --- a/README_zh.md +++ b/README_zh.md @@ -7,7 +7,7 @@ > TypeScript 支持已发布!现在可以在项目中使用 TypeScript 来使用 queryx,[查看文档](https://github.com/swiftcarrot/queryx/blob/main/docs/generator-typescript-client.md)进行操作。 -image +image Queryx 是一个 schema 优先、类型安全的 ORM。