Skip to main content
0

āļŠāļĢāļļāļ›āļŠāļąāđ‰āļ™ āđ†

āđ€āļ‚āļĩāļĒāļ™ Go āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ SQL āđ„āļĄāđˆāļĢāļđāđ‰āļˆāļ°āļˆāļąāļ GORM āđ„āļĄāđˆāđ„āļ”āđ‰āđāļĨāđ‰āļ§āļ§

āđ€āļ‚āļĩāļĒāļ™āđ‚āļ”āļĒ
Sirasit Boonklang (Aeff)
Tech and Coding Consultant

āļšāļ—āļ„āļ§āļēāļĄāļ™āļĩāđ‰āļ•āļĩāļžāļīāļĄāļžāđŒ āđāļĨāļ° āđ€āļœāļĒāđāļžāļĢāđˆāđ€āļĄāļ·āđˆāļ­ 9 āļžāļĪāļĐāļ āļēāļ„āļĄ 2566

GORM āļ„āļ·āļ­āļ­āļ°āđ„āļĢ

GORM āļ„āļ·āļ­ Library āļ‚āļ­āļ‡ ORM āļŠāļģāļŦāļĢāļąāļšāđƒāļŠāđ‰āļ‡āļēāļ™āđƒāļ™āļ āļēāļĐāļē Golang

āđāļĨāđ‰āļ§āđ€āļˆāđ‰āļē ORM āđ€āļ™āļĩāđˆāļĒāļ„āļ·āļ­āļ­āļ°āđ„āļĢāļ­āļĩāļ?

ORM āļ„āļ·āļ­ āđ€āļ—āļ„āļ™āļīāļ„āļ—āļĩāđˆāļŠāđˆāļ§āļĒāđƒāļŦāđ‰āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āđāļĄāļ›āļ‚āđ‰āļ­āļĄāļđāļĨāļĢāļ°āļŦāļ§āđˆāļēāļ‡ Relational Database āļāļąāļšāļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļĄāļīāđˆāļ‡āļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āđāļšāļš OOP āđ‚āļ”āļĒāļˆāļ°āļ—āļģāđƒāļŦāđ‰āđ€āļĢāļēāđ„āļĄāđˆāļˆāļģāđ€āļ›āđ‡āļ™āļ•āđ‰āļ­āļ‡āđ€āļ‚āļĩāļĒāļ™āļ„āļģāļŠāļąāđˆāļ‡ SQL āđ€āļ­āļ‡ āđāļ•āđˆāļˆāļ°āđ€āļ›āđ‡āļ™āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđƒāļ™āļĢāļđāļ›āđāļšāļšāļ„āļģāļŠāļąāđˆāļ‡āļ‚āļ­āļ‡āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļĄāļīāđˆāļ‡āļ™āļąāđ‰āļ™ āđ† āđ„āļ”āđ‰āđ€āļĨāļĒ āļ—āļģāđƒāļŦāđ‰āļĨāļ”āļ„āļ§āļēāļĄāļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļ‚āļ­āļ‡āļāļēāļĢāļ•āļīāļ”āļ•āđˆāļ­āļŦāļĢāļ·āļ­āļĄāļĩ Interact āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ

āļŸāļĩāđ€āļˆāļ­āļĢāđŒāđ€āļ”āđ‡āļ” āđ† āļ‚āļ­āļ‡āđ€āļˆāđ‰āļē GORM

1. Associations: GORM āļĢāļ­āļ‡āļĢāļąāļšāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāđ‚āļĒāļ‡āļ›āļĢāļ°āđ€āļ āļ—āļ•āđˆāļēāļ‡ āđ† āđ€āļŠāđˆāļ™ has one, have many, belongs to, many to many, polymorphism āđāļĨāļ° single-table inheritance āļŠāļīāđˆāļ‡āļ™āļĩāđ‰āļ—āļģāđƒāļŦāđ‰āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļāļģāļŦāļ™āļ”āđāļĨāļ°āļˆāļąāļ”āļāļēāļĢāļ„āļ§āļēāļĄāļŠāļąāļĄāļžāļąāļ™āļ˜āđŒāļĢāļ°āļŦāļ§āđˆāļēāļ‡āļ•āļēāļĢāļēāļ‡āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ•āđˆāļēāļ‡ āđ† āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āļ‡āđˆāļēāļĒāļ”āļēāļĒ

2. Hooks: GORM āļˆāļąāļ”āđ€āļ•āļĢāļĩāļĒāļĄ hooks āļŠāļģāļŦāļĢāļąāļš āļāđˆāļ­āļ™āđāļĨāļ°āļŦāļĨāļąāļ‡ Create/Save/Update/Delete/Find operation āļ—āļģāđƒāļŦāđ‰āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ– custom logic āđ„āļ”āđ‰

3.Eager loading: GORM āļĢāļ­āļ‡āļĢāļąāļš eager loading āđ‚āļ”āļĒāđƒāļŠāđ‰ Method Preload āđāļĨāļ° Joins āļ—āļģāđƒāļŦāđ‰āļĨāļ”āļˆāļģāļ™āļ§āļ™āļāļēāļĢāļ”āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ‰āļžāļēāļ°āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡

4.Transactions: GORM āļĢāļ­āļ‡āļĢāļąāļš transaction āđāļĨāļ° nested transaction āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āļĄāļąāđˆāļ™āđƒāļˆāđ„āļ”āđ‰āļ–āļķāļ‡āļ„āļ§āļēāļĄāļŠāļ­āļ”āļ„āļĨāđ‰āļ­āļ‡āđāļĨāļ°āļ„āļ§āļēāļĄāļŠāļĄāļšāļđāļĢāļ“āđŒāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļĄāļ·āđˆāļ­āļĄāļĩāļāļēāļĢāđƒāļŠāđ‰āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļŦāļĨāļēāļĒ operation

5. Context and Prepared Statement Mode āļĢāļ­āļ‡āļĢāļąāļš Context āđāļĨāļ°āđ‚āļŦāļĄāļ”āļ„āļģāļŠāļąāđˆāļ‡āļ—āļĩāđˆāđ€āļ•āļĢāļĩāļĒāļĄāđ„āļ§āđ‰ āļ—āļģāđƒāļŦāđ‰āļĨāļ”āļ„āļ§āļēāļĄāđ€āļŠāļĩāđˆāļĒāļ‡āļ‚āļ­āļ‡āļāļēāļĢāđ‚āļˆāļĄāļ•āļĩ SQL Injection

6. Batch Insert āđāļĨāļ° FindInBatches: GORM āļĄāļĩāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļāļēāļĢāđāļ—āļĢāļāđāļĨāļ°āļāļēāļĢāļ„āđ‰āļ™āļŦāļēāđƒāļ™ Batch āļ‹āļķāđˆāļ‡āļŠāđˆāļ§āļĒāļ›āļĢāļąāļšāļ›āļĢāļļāļ‡āļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ€āļĄāļ·āđˆāļ­āļ—āļģāļ‡āļēāļ™āļāļąāļšāļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļģāļ™āļ§āļ™āļĄāļēāļ

7. SQL Builder: āļ•āļąāļ§āļŠāļĢāđ‰āļēāļ‡ SQL āļ—āļĩāđˆāļĢāļ­āļ‡āļĢāļąāļš Upsert, Locking, Optimizer/Index/Comment Hints, Argument āļ—āļĩāđˆāļĄāļĩāļŠāļ·āđˆāļ­ āđāļĨāļ° SubQuery

8.Composite Primary Key: GORM āļĢāļ­āļ‡āļĢāļąāļš āļ„āļĩāļĒāđŒāļŦāļĨāļąāļāđāļšāļšāļœāļŠāļĄ Index āđāļĨāļ° constraint āļ—āļģāđƒāļŦāđ‰āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļāļģāļŦāļ™āļ” schema āļ‹āļąāļšāļ‹āđ‰āļ­āļ™āļĄāļēāļāļ‚āļķāđ‰āļ™āđāļĨāļ°āļĢāļąāļšāļ›āļĢāļ°āļāļąāļ™āļ„āļ§āļēāļĄāļŠāļĄāļšāļđāļĢāļ“āđŒāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰

9.Auto Migrations: āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļāļēāļĢāļĒāđ‰āļēāļĒāļ‚āđ‰āļ­āļĄāļđāļĨāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļīāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļ•āļēāļĢāļēāļ‡āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļ­āļ­āđ‚āļ•āđ‰āđāļĨāļ°āļ­āļąāļ›āđ€āļ”āļ• schema āđ„āļ”āđ‰āļ•āļēāļĄāđƒāļˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ

10.Logger: GORM āđ€āļ„āđ‰āļēāļĄāļĩ ****Logger**** āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āđ€āļĢāļē Debug āđāļĨāļ°āđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļāļēāļĢāļ”āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰

11.API, Plugin āđāļĨāļ° Extension: āļĄāļĩ API, Plugin āđāļĨāļ° Extension āđƒāļŦāđ‰āđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āļāļĢāļ°āļšāļļāļ‡ (āđ€āļĒāļ­āļ°āļĄāļēāļ) āļ—āļģāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļžāļīāđˆāļĄāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļŦāļĢāļ·āļ­āļ•āđˆāļ­āļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ­āļ·āđˆāļ™ āđ† āđ„āļ”āđ‰āļ­āļĩāļāļĄāļēāļāļĄāļēāļĒ

12.Developer Friendly: āđ€āļŦāļĨāđˆāļēāđ€āļ”āļŸāļ­āļĒāđˆāļēāļ‡āđ€āļĢāļē āđ† āļˆāļ°āļĒāļīāđ‰āļĄāļ‡āđˆāļēāļĒāđ€āļžāļĢāļēāļ°āļĄāļąāļ™āđƒāļŠāđ‰āđ„āļ”āđ‰āļ‡āđˆāļēāļĒ Docs āļāđ‡āļ­āđˆāļēāļ™āđ„āļĄāđˆāļĒāļēāļ āđƒāļ„āļĢāļ­āļĒāļēāļāļ­āđˆāļēāļ™āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļŠāļēāļĄāļēāļĢāļ–āđ„āļ›āļ•āļģāđ„āļ”āđ‰āļ—āļĩāđˆ [GORM Guides | GORM – The fantastic ORM library for Golang, aims to be developer friendly.](https://gorm.io/docs/)

9.Auto Migrations: āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļāļēāļĢāļĒāđ‰āļēāļĒāļ‚āđ‰āļ­āļĄāļđāļĨāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļīāļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āļ•āļēāļĢāļēāļ‡āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđāļšāļšāļ­āļ­āđ‚āļ•āđ‰āđāļĨāļ°āļ­āļąāļ›āđ€āļ”āļ• schema āđ„āļ”āđ‰āļ•āļēāļĄāđƒāļˆāļ•āđ‰āļ­āļ‡āļāļēāļĢ

10.Logger: GORM āđ€āļ„āđ‰āļēāļĄāļĩ Logger āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļŠāđˆāļ§āļĒāđƒāļŦāđ‰āđ€āļĢāļē Debug āđāļĨāļ°āđ€āļžāļīāđˆāļĄāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļžāļāļēāļĢāļ”āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰

11.API, Plugin āđāļĨāļ° Extension: āļĄāļĩ API, Plugin āđāļĨāļ° Extension āđƒāļŦāđ‰āđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āļāļĢāļ°āļšāļļāļ‡ (āđ€āļĒāļ­āļ°āļĄāļēāļ) āļ—āļģāđƒāļŦāđ‰āļŠāļēāļĄāļēāļĢāļ–āđ€āļžāļīāđˆāļĄāļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļŦāļĢāļ·āļ­āļ•āđˆāļ­āļāļąāļšāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ­āļ·āđˆāļ™ āđ† āđ„āļ”āđ‰āļ­āļĩāļāļĄāļēāļāļĄāļēāļĒ

12.Developer Friendly: āđ€āļŦāļĨāđˆāļēāđ€āļ”āļŸāļ­āļĒāđˆāļēāļ‡āđ€āļĢāļē āđ† āļˆāļ°āļĒāļīāđ‰āļĄāļ‡āđˆāļēāļĒāđ€āļžāļĢāļēāļ°āļĄāļąāļ™āđƒāļŠāđ‰āđ„āļ”āđ‰āļ‡āđˆāļēāļĒ Docs āļāđ‡āļ­āđˆāļēāļ™āđ„āļĄāđˆāļĒāļēāļ āđƒāļ„āļĢāļ­āļĒāļēāļāļ­āđˆāļēāļ™āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāļŠāļēāļĄāļēāļĢāļ–āđ„āļ›āļ•āļģāđ„āļ”āđ‰āļ—āļĩāđˆ GORM Guides | GORM – The fantastic ORM library for Golang, aims to be developer friendly.

āđ€āļĄāļ·āđˆāļ­āđ€āļĢāļēāđ„āļ”āđ‰āļĢāļđāđ‰āļˆāļąāļāļāļąāļš GORM āļāļąāļ™āđ„āļ›āđāļĨāđ‰āļ§āđ€āļĢāļēāļĄāļēāļ”āļđāļ§āļīāļ˜āļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āļāļąāļ™āļ”āļĩāļāļ§āđˆāļēāļēāļēāļē

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ GORM āļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ MySQL

1.āđ€āļĢāļīāđˆāļĄāļˆāļēāļāļŠāļĢāđ‰āļēāļ‡āđ‚āļŸāļĨāđ€āļ”āļ­āļĢāđŒāđ‚āļ›āļĢāđ€āļˆāļāļ•āđŒāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ md <āļŠāļ·āđˆāļ­āđ‚āļŸāļĨāđ€āļ”āļ­āļĢāđŒ>  āđāļĨāđ‰āļ§āļ—āļģāļāļēāļĢ cd <āļŠāļ·āđˆāļ­āđ‚āļŸāļĨāđ€āļ”āļ­āļĢāđŒ> āļŦāļĨāļąāļ‡āļˆāļēāļāļ™āļąāđ‰āļ™āđ€āļ›āļīāļ”āđ‚āļ›āļĢāđāļāļĢāļĄ VS Code āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ code .

2. āđ€āļĢāļīāđˆāļĄāļˆāļēāļāļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ go mod āļ‚āļ­āļ‡āđ‚āļ›āļĢāđ€āļˆāļāļ•āđŒāļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ go mod init <github repo>/āļŠāļ·āđˆāļ­āđ‚āļ›āļĢāđ€āļˆāļāļ•āđŒ

3. āļ•āļīāļ”āļ•āļąāđ‰āļ‡ GORM āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ go get -u gorm.io/gorm

4. āļŠāļĢāđ‰āļēāļ‡āđ„āļŸāļĨāđŒ main.go āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āļ›āļĢāļ°āļāļēāļĻ package āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™āđ€āļ›āđ‡āļ™ main āļŠāļĢāđ‰āļēāļ‡āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ main āđƒāļŦāđ‰āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒ āđāļĨāļ°āļ—āļģāļāļēāļĢ import “gorm.io/gorm” āļĄāļēāļ”āđ‰āļ§āļĒāļ™āļ°

package main

import (
	"gorm.io/gorm"
)

func main() {
}

5. āļ•āđˆāļ­āļĄāļēāļāļģāļŦāļ™āļ”āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ āļŠāļ·āđˆāļ­āļ•āļēāļĢāļēāļ‡āđāļĨāļ°āļŸāļīāļĨāļ”āđŒāļ•āđˆāļēāļ‡ āđ† (āļ„āļ­āļĨāļąāļĄāļ™āđŒāļ‚āļ­āļ‡āļ•āļēāļĢāļēāļ‡) āļ§āđˆāļēāļĄāļĩāļ­āļ°āđ„āļĢāļšāđ‰āļēāļ‡āđ‚āļ”āļĒāđƒāļ™ Go āđ€āļ§āļĨāļēāļ—āļĩāđˆāđ€āļ‚āļĩāļĒāļ™āđ€āļ›āđ‡āļ™ ORM āđ€āļĢāļēāļˆāļ°āđ€āļ‚āļĩāļĒāļ™āļ­āļĒāļđāđˆāđƒāļ™āļĢāļđāļ›āđāļšāļš Struct āļ™āļ°

āđƒāļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ™āļĩāđ‰ āđ€āļĢāļēāđ„āļ”āđ‰āļāļģāļŦāļ™āļ”āđ‚āļ„āļĢāļ‡āļŠāļĢāđ‰āļēāļ‡āļ‚āļ­āļ‡āļ•āļēāļĢāļēāļ‡ `User` āļ”āđ‰āļ§āļĒāļŸāļīāļĨāļ”āđŒ ID, Name, Email, Age, CreateAt āđāļĨāļ° UpdatedAt āđāļĨāļ°āđ€āļĢāļēāļĄāļĩāļāļēāļĢāđƒāļŠāđ‰ gorm āđƒāļ™āļāļēāļĢāļāļģāļŦāļ™āļ”āļ‚āđ‰āļ­āļˆāļģāļāļąāļ”āļŠāļģāļŦāļĢāļąāļšāđāļ•āđˆāļĨāļ°āļŸāļīāļĨāļ”āđŒ

type User struct {
    ID        uint   `gorm:"primarykey"`
    Name      string `gorm:"not null"`
    Email     string `gorm:"unique"`
    Age       int
    CreatedAt time.Time
    UpdatedAt time.Time
}

āļŠāđˆāļ§āļ™āļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ

 

6. āļ•āđˆāļ­āļĄāļēāđ€āļĢāļēāļāđ‡āļĄāļēāļ—āļģāļāļēāļĢāđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ‚āļ”āļĒāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ™āļĩāđ‰āļœāļĄāļˆāļ°āđƒāļŠāđ‰āđ€āļ›āđ‡āļ™ MySQL āđāļ•āđˆāđ„āļĄāđˆāđƒāļŠāđˆāļ§āđˆāļē GORM āļˆāļ°āļ•āđˆāļ­āđ„āļ”āđ‰āđāļ„āđˆ MySQL āļ™āļ° āļĄāļąāļ™āļĒāļąāļ‡āļ•āđˆāļ­āļāļąāļš PostgreSQL, SQLite, SQL Server, āđāļĨāļ° TiDB āđ„āļ”āđ‰āļ­āļĩāļāļ”āđ‰āļ§āļĒ āđ‚āļ”āļĒāđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļāļēāļĢāđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™ MySQL āļˆāļ°āļ•āđ‰āļ­āļ‡āļ—āļģāļāļēāļĢāļ•āļīāļ”āļ•āļąāđ‰āļ‡āļ”āđ‰āļ§āļĒāļ„āļģāļŠāļąāđˆāļ‡ go get gorm.io/driver/mysql

āđāļĨāļ°āđ€āļĢāļĩāļĒāļāđƒāļŠāđ‰āļ‡āļēāļ™āđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡ import āļ”āđ‰āļ§āļĒāļ™āļ°āļ„āļĢāļąāļš

package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

7. āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ GORM Database Connection āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ MySQL

db, err := gorm.Open(mysql.Open("username:password@tcp(127.0.0.1:3306)/āļŠāļ·āđˆāļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{})
	if err != nil {
		panic("failed to connect to database")
	}
  • mysql.Open: āđ€āļ›āđ‡āļ™āļāļēāļĢāļĢāļ°āļšāļļāļ§āđˆāļēāđ€āļĢāļēāļāļģāļĨāļąāļ‡āđƒāļŠāđ‰āđ„āļ”āļĢāđ€āļ§āļ­āļĢāđŒ MySQL āđ€āļžāļ·āđˆāļ­āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ
  • &gorm.Config{}: āļŠāļĢāđ‰āļēāļ‡ GORM Config āđƒāļŦāļĄāđˆāļžāļĢāđ‰āļ­āļĄāļ„āđˆāļē default
  • db, err := gorm.Open(…): āđ€āļ›āļīāļ” Database Connection āđƒāļŦāļĄāđˆāđ‚āļ”āļĒāđƒāļŠāđ‰āđ„āļ”āļĢāđ€āļ§āļ­āļĢāđŒāđāļĨāļ° Configuration
  • if err != nil {…}: āđ€āļ›āđ‡āļ™āļ•āļąāļ§āđ€āļŠāđ‡āļ„ error

8. āļāđˆāļ­āļ™āļ—āļĩāđˆāđ€āļĢāļēāļˆāļ°āđƒāļŠāđ‰ User model āđ„āļ”āđ‰ āđ€āļĢāļēāļ•āđ‰āļ­āļ‡āļŠāļĢāđ‰āļēāļ‡āļ•āļēāļĢāļēāļ‡āđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļāđˆāļ­āļ™ āđ‚āļ”āļĒāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ AutoMigrate āļ‚āļ­āļ‡ GORM āļŸāļąāļ‡āļāđŒāļŠāļąāļ™āļ™āļĩāđ‰āļˆāļ°āļŠāļĢāđ‰āļēāļ‡āļ•āļēāļĢāļēāļ‡āļŠāļģāļŦāļĢāļąāļš User model āđ‚āļ”āļĒāļ­āļąāļ•āđ‚āļ™āļĄāļąāļ•āļī

db.AutoMigrate(&User{})

9. āđ€āļĄāļ·āđˆāļ­āđ€āļĢāļēāļ—āļģāļāļēāļĢāļ•āđˆāļ­āļāļąāļšāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§āļ•āđˆāļ­āļĄāļēāđ€āļĢāļēāļĄāļēāļĨāļ­āļ‡āļ—āļģ CRUD Operation āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨ āļ”āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨ āļ­āļąāļ›āđ€āļ”āļ•āļ‚āđ‰āļ­āļĄāļđāļĨ āđāļĨāļ°āļĨāļ­āļ‡āļĨāļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļ”āđ‰āļ§āļĒ Go āļāļąāļ™āļ„āļĢāļąāļš

Create Operation

10. āļāļēāļĢāđ€āļžāļīāđˆāļĄāļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ›āļĒāļąāļ‡āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡ User āļ„āļ™āđƒāļŦāļĄāđˆāđ€āļ‚āđ‰āļēāđ„āļ›āđ„āļ”āđ‰āđ‚āļ”āļĒāđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ Create āļ—āļĩāđˆāļĄāļēāļāļąāļš GORM āđ„āļ”āđ‰āđ€āļĨāļĒ āđ€āļŠāđˆāļ™ āđ€āļĢāļēāļˆāļ°āļĨāļ­āļ‡āļŠāļĢāđ‰āļēāļ‡ User āļŠāļ·āđˆāļ­ Sirasit, āļ­āļĩāđ€āļĄāļĨāļ„āļ·āļ­ sirasit@example.com āđāļĨāļ°āļ­āļēāļĒāļļāđ€āļ›āđ‡āļ™ 25 āļ›āļĩ āđāļĨāđ‰āļ§āđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ Create āļˆāļ°āđ€āļ‚āļĩāļĒāļ™āđ„āļ”āđ‰āļ•āļēāļĄāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ”āđ‰āļēāļ™āļĨāđˆāļēāļ‡

user := User{
        Name:  "Sirasit",
        Email: "sirasit@example.com",
        Age:   25,
    }
    result := db.Create(&user)
    if result.Error != nil {
        panic("failed to create user")
    }

 

āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āđāļšāļšāđ€āļ•āđ‡āļĄ āđ† āļ™āļ°āļ„āļĢāļąāļš

package main

import (
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type User struct {
	ID        uint   `gorm:"primarykey"`
	Name      string `gorm:"not null"`
	Email     string `gorm:"unique"`
	Age       int
	CreatedAt time.Time
	UpdatedAt time.Time
}

func main() {

	db, err := gorm.Open(mysql.Open("āļŠāļ·āđˆāļ­āļœāļđāđ‰āđƒāļŠāđ‰:āļĢāļŦāļąāļŠāļœāđˆāļēāļ™(127.0.0.1:3306)/āļŠāļ·āđˆāļ­āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨ?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{})
	if err != nil {
		panic("failed to connect to database")
	}

	db.AutoMigrate(&User{})

	user := User{
		Name:  "Sirasit",
		Email: "sirasit@example.com",
		Age:   25,
	}
	result := db.Create(&user)
	if result.Error != nil {
		panic("failed to create user")
	}
}

āļœāļĨāļĨāļąāļžāļ˜āđŒāļ—āļĩāđˆāđ„āļ”āđ‰āļˆāļēāļāļāļēāļĢāļĢāļąāļ™āđ‚āļ›āļĢāđāļāļĢāļĄāļˆāļ°āđ€āļŦāđ‡āļ™āđ„āļ”āđ‰āļ§āđˆāļēāļĄāļĩāļ‚āđ‰āļ­āļĄāļđāļĨāļ—āļĩāđˆāđ€āļĢāļēāđ„āļ”āđ‰āļ—āļģāļāļēāļĢāđ€āļžāļīāđˆāļĄāđ€āļ‚āđ‰āļēāđ„āļ› āđ„āļ›āļ­āļĒāļđāđˆāđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļ›āđ‡āļ™āļ—āļĩāđˆāđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§āļ™āļ°āļ„āļĢāļąāļš āļŠāļģāļŦāļĢāļąāļšāđƒāļ™āļ•āļ­āļ™āļ™āļĩāđ‰āļœāļĄāļˆāļ°āđƒāļŠāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ—āļĩāđˆāļŠāļ·āđˆāļ­āļ§āđˆāļē MySQL Workbench āđƒāļ™āļāļēāļĢāđ€āļĢāļĩāļĒāļāļ”āļđāļ‚āđ‰āļ­āļĄāļđāļĨāļ™āļ°āļ„āļĢāļąāļš

āļŠāļģāļŦāļĢāļąāļšāđƒāļ„āļĢāļ—āļĩāđˆāļ­āļĒāļēāļāļ”āļđāļ§āļīāļ˜āļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ MySQL Workbench āļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āļĢāđˆāļ§āļĄāļāļąāļšāļ āļēāļĐāļē Go āđ„āļ”āđ‰āļ—āļĩāđˆ https://youtu.be/fjEB75Xotxc?t=12764

Read Operation

11. āđƒāļ™āļāļēāļĢāļ­āđˆāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļˆāļēāļāļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ Find āđāļĨāļ° First āđ„āļ”āđ‰ āđ‚āļ”āļĒāđ€āļĄāļ·āđˆāļ­āđ€āļĢāļēāđ„āļ”āđ‰āļ—āļģāļāļēāļĢāļ”āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĄāļēāđāļĨāđ‰āļ§āđ€āļĢāļēāļˆāļ°āļ—āļģāļāļēāļĢāđ€āļŠāđ‡āļ„ Error āđāļĨāļ°āđƒāļŠāđ‰ for loop āđƒāļ™āļāļēāļĢāļ”āļķāļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđāļ•āđˆāļĨāļ°āļ•āļąāļ§āļ­āļ­āļāļĄāļēāđāļŠāļ”āļ‡

var users []User
result := db.Find(&users)

if result.Error != nil {
		panic("Failed to find users")
}

for _, user := range users {
		fmt.Printf("ID: %d, Name: %s, Email: %s, Age: %d\n", user.ID, user.Name, user.Email)
}

 

āļŦāļĢāļ·āļ­āļŦāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ”āļķāļ‡āđ€āļ‰āļžāļēāļ° ID āļ™āļąāđ‰āļ™ āđ† āđ€āļĢāļēāļāđ‡āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āļŸāļąāļ‡āļāđŒāļŠāļąāļ™ First āļŦāļĢāļ·āļ­ Find āđāļĨāļ°āļœāđˆāļēāļ™āļ„āđˆāļēāļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢāļŠāļ·āđˆāļ­āļ•āļēāļĢāļēāļ‡āđāļĨāļ° ID āđ€āļ‚āđ‰āļēāđ„āļ›āđ„āļ”āđ‰

var user User
	result := db.Find(&user, 1) // Find the user with ID 1
	if result.Error != nil {
		panic(result.Error)
	}
	fmt.Println(user)

Update Operation

 

12. āđƒāļ™āļāļēāļĢāļ­āļąāļ›āđ€āļ”āļ•āđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ Method Model() āđāļĨāļ° Updates() āđƒāļ™āļāļēāļĢāļ­āļąāļ›āđ€āļ”āļ•āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰ āđ‚āļ”āļĒāđƒāļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļ™āļĩāđ‰ āļˆāļ°āđƒāļŠāđ‰ db.First() āđ€āļžāļ·āđˆāļ­āļ„āđ‰āļ™āļŦāļē user āļ—āļĩāđˆāļĄāļĩ ID āđ€āļ›āđ‡āļ™ 1 āđāļĨāđ‰āļ§āļāđ‡āđƒāļŠāđ‰ db.Model().Updates() āđ€āļžāļ·āđˆāļ­āļ­āļąāļ›āđ€āļ”āļ• Name āđƒāļŦāđ‰āđ€āļ›āđ‡āļ™ “Sirasit Boonklang” āđāļ—āļ™ āđāļĨāļ°āđƒāļ™āļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āđ‚āļ„āđ‰āļ”āļ™āļĩāđ‰āļœāļĄāļāđ‡āļĄāļĩāļāļēāļĢāđ€āļŠāđ‡āļ„ Error āđāļĨāļ°āļ™āļģāļ‚āđ‰āļ­āļĄāļđāļĨ ID āļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļ­āļąāļ›āđ€āļ”āļ•āļĄāļēāđāļŠāļ”āļ‡āļ”āđ‰āļ§āļĒ

var user User
	db.First(&user, 1)
	db.Model(&user).Updates(User{Name: "Sirasit Boonklang"})
	result := db.First(&user, 1)
	if result.Error != nil {
		panic(result.Error)
	}
	fmt.Println(user)

Delete Operation

 

13. āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļĨāļšāļ‚āđ‰āļ­āļĄāļđāļĨāđƒāļ™āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļĢāļēāļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰ Method Delete āļ‚āļ­āļ‡ GORM āđ„āļ”āđ‰āđ€āļĨāļĒāđ‚āļ”āļĒāđƒāļŠāđ‰āļ„āļģāļŠāļąāđˆāļ‡ db.Delete()

var user User
	result := db.Find(&user, 1)
	if result.Error != nil {
		panic(result.Error)
	}

	result = db.Delete(&user)
	if result.Error != nil {
		panic(result.Error)
	}

āđāļĨāļ°āđāļĨāđ‰āļ§āļ•āļ­āļ™āļ™āļĩāđ‰āđ€āļĢāļēāļāđ‡āđ„āļ”āđ‰āđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āļžāļ·āđ‰āļ™āļāļēāļ™āđ€āļšāļ·āđ‰āļ­āļ‡āļ•āđ‰āļ™āđ€āļāļĩāđˆāļĒāļ§āļāļąāļš GORM āđ„āļ›āđāļĨāđ‰āļ§āļ™āļ°āļ„āļĢāļąāļš āđāļ•āđˆāđ€āļĢāļēāļĒāļąāļ‡āļ•āļīāļ”āđƒāļ™āļŠāđˆāļ§āļ™āļ‚āļ­āļ‡āļāļēāļĢāđƒāļŠāđ‰ gorm.Model āļāļąāļ™āļ™āļ°āļ„āļĢāļąāļš āđ€āļ”āļĩāđ‹āļĒāļ§āļœāļĄāļˆāļ°āļžāļēāđ„āļ›āļ”āļđāļ§āđˆāļēāļāļēāļĢāđƒāļŠāđ‰ gorm.Model āļĄāļąāļ™āļŠāđˆāļ§āļĒāđ€āļĢāļēāļĒāļąāļ‡āđ„āļ‡āđ„āļ”āđ‰āļšāđ‰āļēāļ‡āđ„āļ›āļ”āļđāļāļąāļ™āļ„āļĢāļąāļš

gorm.Model āļ„āļ·āļ­āļ­āļ°āđ„āļĢ

gorm.Model āđ€āļ›āđ‡āļ™ Struct āļ—āļĩāđˆāļĄāļēāļāļąāļšāđ€āļˆāđ‰āļē GORM Lib āļ•āļąāļ§āļ™āļĩāđ‰ āđ‚āļ”āļĒ gorm.Model āļˆāļ°āļĄāļēāļžāļĢāđ‰āļ­āļĄāļāļąāļšāļŸāļīāļĨāļ”āđŒ ID, CreateAt, UpdateAt, DeletedAt āļ‹āļķāđˆāļ‡āļ›āļāļ•āļīāđāļĨāđ‰āļ§āļāļēāļ™āļ‚āđ‰āļ­āļĄāļđāļĨāļŠāđˆāļ§āļ™āđƒāļŦāļāđˆāļāđ‡āļˆāļ°āļĄāļĩāļŸāļīāļĨāļ”āđŒāđ€āļŦāļĨāđˆāļēāļ™āļĩāđ‰āļ­āļĒāļđāđˆ

// gorm.Model definition
type Model struct {
  ID        uint           `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt gorm.DeletedAt `gorm:"index"`
}

āđ‚āļ”āļĒ ID āļˆāļ°āđ€āļ›āđ‡āļ™āļŸāļīāļĨāļ”āđŒāļ—āļĩāđˆāđ€āļ›āđ‡āļ™ Primary Key āļ‚āļ­āļ‡āđ‚āļĄāđ€āļ”āļĨ, CreateAt āđ€āļ­āļēāđ„āļ§āđ‰āđ€āļāđ‡āļšāļ§āđˆāļēāđ€āļ§āļĨāļēāļ—āļĩāđˆāļ‚āđ‰āļ­āļĄāļđāļĨāļ–āļđāļāļŠāļĢāđ‰āļēāļ‡āļ‚āļķāđ‰āļ™āļĄāļē, UpdateAt āļŠāļģāļŦāļĢāļąāļšāđ€āļāđ‡āļšāđ€āļ§āļĨāļēāļ—āļĩāđˆāļĄāļĩāļāļēāļĢāļ­āļąāļ›āđ€āļ”āļ•āļĨāđˆāļēāļŠāļļāļ” āđāļĨāļ°āļŸāļīāļĨāļ”āđŒāļŠāļļāļ”āļ—āđ‰āļēāļĒāļ„āļ·āļ­ DeletedAt āđ€āļ›āđ‡āļ™āļŸāļīāļĨāļ”āđŒāļ—āļĩāđˆāļˆāļ°āļšāļąāļ™āļ—āļķāļāđ€āļ§āļĨāļēāđāļĨāļ°āļ—āļģāđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļŦāļĄāļēāļĒāļ§āđˆāļēāļĨāļšāđāļĨāđ‰āļ§āļ™āļąāđˆāļ™āđ€āļ­āļ‡āđ€āļ›āđ‡āļ™āđāļšāļš Soft Delete

āđ€āļĄāļ·āđˆāļ­āđ€āļĢāļēāļˆāļ°āđƒāļŠāđ‰ gorm.Model āđ€āļĢāļēāđāļ„āđˆāđāļ›āļ°āļ„āļģāļŠāļąāđˆāļ‡āđ„āļ§āđ‰āđƒāļ™ Struct āļ‚āļ­āļ‡āļ•āļēāļĢāļēāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ€āļĢāļē āđ€āļžāļĩāļĒāļ‡āđ€āļ—āđˆāļēāļ™āļĩāđ‰āđ€āļĢāļēāļāđ‡āļˆāļ°āđ„āļ”āđ‰āļŸāļīāļĨāļ”āđŒāļ‚āļ­āļ‡ gorm.Model āļĄāļēāđƒāļŠāđ‰āđ€āļĢāļĩāļĒāļšāļĢāđ‰āļ­āļĒāđāļĨāđ‰āļ§āļ§āļ§

type User struct {
	gorm.Model
    Name      string `gorm:"not null"`
    Email     string `gorm:"unique"`
    Age       int
}

āđ€āļ›āđ‡āļ™āļĒāļąāļ‡āđ„āļ‡āļšāđ‰āļēāļ‡āļ„āļĢāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ GORM āđ„āļĄāđˆāļĒāļēāļāđ€āļĨāļĒāđƒāļŠāđˆāļĄāļąāđ‰āļĒāļ„āļĢāļąāļš āļŦāļēāļāđ€āļžāļ·āđˆāļ­āļ™ āđ† āļ­āļĒāļēāļāļāļķāļāļŠāļāļīāļĨāđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ€āļāļĩāđˆāļĒāļ§āļāļąāļšāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ GORM āļ­āđˆāļēāļ™āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄāđ„āļ”āđ‰āļˆāļēāļ Docs āđƒāļ™āļĨāļīāļ‡āļāđŒāļ™āļĩāđ‰āđ„āļ”āđ‰āđ€āļĨāļĒāļ™āļ°āļ„āļĢāļąāļš GORM Guides | GORM – The fantastic ORM library for Golang, aims to be developer friendly.

āđāļĨāļ°āļŦāļēāļāļ­āļĒāļēāļāļĢāļđāđ‰āļ§āđˆāļēāļ–āđ‰āļēāđ€āļĢāļēāđ„āļĄāđˆāđƒāļŠāđ‰ GORM āļ—āļģ CRUD āđāļšāļšāļ›āļāļ•āļīāļˆāļēāļ Standard Library āđ€āļĨāļĒāļĄāļĩāļ§āļīāļ˜āļĩāļāļēāļĢāļĒāļąāļ‡āđ„āļ‡āļšāđ‰āļēāļ‡āđāļĨāļ°āđāļ•āļāļ•āđˆāļēāļ‡āļāļąāļ™āļĒāļąāļ‡āđ„āļ‡āļŠāļēāļĄāļēāļĢāļ–āļ”āļđāļ•āļąāļ§āļ­āļĒāđˆāļēāļ‡āļāļēāļĢāļ—āļģāđ„āļ”āđ‰āļ—āļĩāđˆ (572) āļŠāļ­āļ™āļ—āļģ CRUD āļ”āđ‰āļ§āļĒ Golang āđāļšāļšāđ„āļĄāđˆāđ€āļāļĢāļ‡āđƒāļˆāđƒāļ„āļĢ ! – YouTube

  • app = Flask(name): āļ—āļĩāđˆ āļŠāđˆāļ§āļ™āđƒāļ™āļāļēāļĢāļŠāļĢāđ‰āļēāļ‡ Flask Instance āđ€āļĢāļīāđˆāļĄāļ•āđ‰āļ™
  • app.config[‘SECRET_KEY’] = ‘SECRET_KEY’ : āđāļ­āļ•āļ—āļĢāļīāļšāļīāļ§āļ•āđŒ app.config āđ€āļ›āđ‡āļ™ dict āđƒāļ™āļāļēāļĢāđ€āļāđ‡āļšāļāļēāļĢ config āļ•āđˆāļēāļ‡ āđ† āļ‚āļ­āļ‡āđāļ­āļ› āļˆāļ°āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ‚āļ­āļ‡āļ•āļąāļ§āđāļ›āļĢ config āđ‚āļ”āļĒāđƒāļŠāđ‰ SECRET_KEY āđ€āļ›āđ‡āļ™āļŠāļ•āļĢāļīāļ‡ āđƒāļŠāđ‰āđ€āļ›āđ‡āļ™āļ„āļĩāļĒāđŒāļĨāļąāļšāđ€āļžāļ·āđˆāļ­āđ€āļ‚āđ‰āļēāļĢāļŦāļąāļŠāļ„āļļāļāļāļĩāđ‰āđāļĨāļ°āļ›āđ‰āļ­āļ‡āļāļąāļ™āļāļēāļĢāđ‚āļˆāļĄāļ•āļĩāļ•āđˆāļēāļ‡āđ† āđ€āļŠāđˆāļ™ āļāļēāļĢāđ‚āļˆāļĄāļ•āļĩ CSRF
  • CONNECTION_STRING = “” : āļ•āļąāļ§āđāļ›āļĢ CONNECTION_STRING āļ„āļ·āļ­ Connection String āļ—āļĩāđˆāđƒāļŠāđ‰āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­āļāļąāļšāļšāļąāļāļŠāļĩ Azure Blob Storage āļ„āđˆāļēāļ‚āļ­āļ‡āļŠāļ•āļĢāļīāļ‡āļ™āļĩāđ‰āļĢāļ§āļĄāļ–āļķāļ‡ AccountName, AccountKey, āđāļĨāļ° EndpointSuffix
  • CONTAINER_NAME =””: āļ„āļ·āļ­ āļŠāļ·āđˆāļ­āļ„āļ­āļ™āđ€āļ—āļ™āđ€āļ™āļ­āļĢāđŒāđƒāļ™āļšāļąāļāļŠāļĩ Blob Storage āļ—āļĩāđˆāļˆāļ°āļˆāļąāļ”āđ€āļāđ‡āļšāđ„āļŸāļĨāđŒ

āļĢāļ°āļšāļšāļāļķāļāļ—āļąāļāļĐāļ° āļāļēāļĢāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ

āļ—āļĩāđˆāļžāļĢāđ‰āļ­āļĄāļ•āļĢāļ§āļˆāļœāļĨāļ‡āļēāļ™āļ„āļļāļ“ 24 āļŠāļąāđˆāļ§āđ‚āļĄāļ‡

  • āđ‚āļˆāļ—āļĒāđŒāļ›āļąāļāļŦāļēāļāļ§āđˆāļē 200 āļ‚āđ‰āļ­ āļ—āļĩāđˆāļĢāļ­āļ—āđ‰āļēāļ—āļēāļĒāļ„āļļāļ“āļ­āļĒāļđāđˆ
  • āļĢāļ­āļ‡āļĢāļąāļš 9 āļ āļēāļĐāļēāđ‚āļ›āļĢāđāļāļĢāļĄāļŦāļĨāļąāļ āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ° Java, Python, C āļāđ‡āđ€āļ‚āļĩāļĒāļ™āđ„āļ”āđ‰
  • āđƒāļŠāđ‰āļ‡āļēāļ™āđ„āļ”āđ‰āļŸāļĢāļĩ ! āļ„āļĢāļš 20 āļ‚āđ‰āļ­āļ‚āļķāđ‰āļ™āđ„āļ› āļĢāļąāļš Certificate āđ„āļ›āđ€āļĨāļĒ !!
āđ€āļ‚āđ‰āļēāđƒāļŠāđ‰āļ‡āļēāļ™āļĢāļ°āļšāļš DevLab āļŸāļĢāļĩ !āđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āđ€āļžāļīāđˆāļĄāđ€āļ•āļīāļĄ

āđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āđ„āļ­āļ—āļĩ “āļ­āļąāļžāļŠāļāļīāļĨāđ€āļ‚āļĩāļĒāļ™āđ‚āļ›āļĢāđāļāļĢāļĄ” āļˆāļēāļāļ•āļąāļ§āļˆāļĢāļīāļ‡
āļ›āļąāđ‰āļ™āđƒāļŦāđ‰āļ„āļļāļ“āđ€āļ›āđ‡āļ™ āļ„āļ™āļŠāļēāļĒāđ„āļ­āļ—āļĩāļĢāļ°āļ”āļąāļšāļĄāļ·āļ­āļ­āļēāļŠāļĩāļž

BorntoDev

Author BorntoDev

BorntoDev Co., Ltd.

More posts by BorntoDev
Close Menu

āđ€āļĢāļēāđƒāļŠāđ‰āļ„āļļāļāļāļĩāđ‰āđ€āļžāļ·āđˆāļ­āļžāļąāļ’āļ™āļēāļ›āļĢāļ°āļŠāļīāļ—āļ˜āļīāļ āļēāļž āđāļĨāļ°āļ›āļĢāļ°āļŠāļšāļāļēāļĢāļ“āđŒāļ—āļĩāđˆāļ”āļĩāđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āđ€āļ§āđ‡āļšāđ„āļ‹āļ•āđŒāļ‚āļ­āļ‡āļ„āļļāļ“ āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āļĻāļķāļāļĐāļēāļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āđ„āļ”āđ‰āļ—āļĩāđˆ āļ™āđ‚āļĒāļšāļēāļĒāļ„āļ§āļēāļĄāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ•āļąāļ§ āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ–āļˆāļąāļ”āļāļēāļĢāļ„āļ§āļēāļĄāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ•āļąāļ§āđ€āļ­āļ‡āđ„āļ”āđ‰āļ‚āļ­āļ‡āļ„āļļāļ“āđ„āļ”āđ‰āđ€āļ­āļ‡āđ‚āļ”āļĒāļ„āļĨāļīāļāļ—āļĩāđˆ āļ•āļąāđ‰āļ‡āļ„āđˆāļē

āļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ„āļ§āļēāļĄāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ•āļąāļ§

āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āļ­āļāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļēāļ„āļļāļāļāļĩāđ‰āđ‚āļ”āļĒāđ€āļ›āļīāļ”/āļ›āļīāļ” āļ„āļļāļāļāļĩāđ‰āđƒāļ™āđāļ•āđˆāļĨāļ°āļ›āļĢāļ°āđ€āļ āļ—āđ„āļ”āđ‰āļ•āļēāļĄāļ„āļ§āļēāļĄāļ•āđ‰āļ­āļ‡āļāļēāļĢ āļĒāļāđ€āļ§āđ‰āļ™ āļ„āļļāļāļāļĩāđ‰āļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™

āļĒāļ­āļĄāļĢāļąāļšāļ—āļąāđ‰āļ‡āļŦāļĄāļ”
āļˆāļąāļ”āļāļēāļĢāļ„āļ§āļēāļĄāđ€āļ›āđ‡āļ™āļŠāđˆāļ§āļ™āļ•āļąāļ§
  • āļ„āļļāļāļāļĩāđ‰āļ—āļĩāđˆāļˆāļģāđ€āļ›āđ‡āļ™
    āđ€āļ›āļīāļ”āđƒāļŠāđ‰āļ‡āļēāļ™āļ•āļĨāļ­āļ”

    āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡āļ„āļļāļāļāļĩāđ‰āļĄāļĩāļ„āļ§āļēāļĄāļˆāļģāđ€āļ›āđ‡āļ™āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āđ€āļ§āđ‡āļšāđ„āļ‹āļ•āđŒ āđ€āļžāļ·āđˆāļ­āđƒāļŦāđ‰āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āđƒāļŠāđ‰āđ„āļ”āđ‰āļ­āļĒāđˆāļēāļ‡āđ€āļ›āđ‡āļ™āļ›āļāļ•āļī āđāļĨāļ°āđ€āļ‚āđ‰āļēāļŠāļĄāđ€āļ§āđ‡āļšāđ„āļ‹āļ•āđŒ āļ„āļļāļ“āđ„āļĄāđˆāļŠāļēāļĄāļēāļĢāļ–āļ›āļīāļ”āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļ‚āļ­āļ‡āļ„āļļāļāļāļĩāđ‰āļ™āļĩāđ‰āđƒāļ™āļĢāļ°āļšāļšāđ€āļ§āđ‡āļšāđ„āļ‹āļ•āđŒāļ‚āļ­āļ‡āđ€āļĢāļēāđ„āļ”āđ‰
    āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ„āļļāļāļāļĩāđ‰

  • āļ„āļļāļāļāļĩāđ‰āļŠāļģāļŦāļĢāļąāļšāļāļēāļĢāļ•āļīāļ”āļ•āļēāļĄāļ—āļēāļ‡āļāļēāļĢāļ•āļĨāļēāļ”

    āļ›āļĢāļ°āđ€āļ āļ—āļ‚āļ­āļ‡āļ„āļļāļāļāļĩāđ‰āļ—āļĩāđˆāļĄāļĩāļ„āļ§āļēāļĄāļˆāļģāđ€āļ›āđ‡āļ™āđƒāļ™āļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™āđ€āļžāļ·āđˆāļ­āļāļēāļĢāļ§āļīāđ€āļ„āļĢāļēāļ°āļŦāđŒ āđāļĨāļ° āļ™āļģāđ€āļŠāļ™āļ­āđ‚āļ›āļĢāđ‚āļĄāļŠāļąāļ™ āļŠāļīāļ™āļ„āđ‰āļē āļĢāļ§āļĄāļ–āļķāļ‡āļŦāļĨāļąāļāļŠāļđāļ•āļĢāļŸāļĢāļĩ āđāļĨāļ° āļŠāļīāļ—āļ˜āļīāļžāļīāđ€āļĻāļĐāļ•āđˆāļēāļ‡ āđ† āļ„āļļāļ“āļŠāļēāļĄāļēāļĢāļ–āđ€āļĨāļ·āļ­āļāļ›āļīāļ”āļ„āļļāļāļāļĩāđ‰āļ›āļĢāļ°āđ€āļ āļ—āļ™āļĩāđ‰āđ„āļ”āđ‰āđ‚āļ”āļĒāđ„āļĄāđˆāļŠāđˆāļ‡āļœāļĨāļ•āđˆāļ­āļāļēāļĢāļ—āļģāļ‡āļēāļ™āļŦāļĨāļąāļ āđ€āļ§āđ‰āļ™āđāļ•āđˆāļāļēāļĢāļ™āļģāđ€āļŠāļ™āļ­āđ‚āļ›āļĢāđ‚āļĄāļŠāļąāļ™āļ—āļĩāđˆāļ­āļēāļˆāđ„āļĄāđˆāļ•āļĢāļ‡āļāļąāļšāļ„āļ§āļēāļĄāļ•āđ‰āļ­āļ‡āļāļēāļĢ
    āļĢāļēāļĒāļĨāļ°āđ€āļ­āļĩāļĒāļ”āļ„āļļāļāļāļĩāđ‰

āļšāļąāļ™āļ—āļķāļāļāļēāļĢāļ•āļąāđ‰āļ‡āļ„āđˆāļē