# Database · GORM Guide
NOTE don't forgot params parseTime to handle data type time.Time, more support parameters

# Database

- Connecting to a database
  - MySQL
  - PostgreSQL
  - Sqlite3
  - Write Dialect for unsupported databases
- Generic database object *sql.DB
- Migration
  - Auto Migration
  - Has Table
  - Create Table
  - Drop table
  - ModifyColumn
  - DropColumn
  - Add Foreign Key
  - Indexes

## Connecting to a database

#### MySQL

NOTE don't forgot params `parseTime` to handle data type `time.Time`, more support parameters

    import (
        "github.com/jinzhu/gorm"
        _ "github.com/go-sql-driver/mysql"
    )
    func main() {
      db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local")
    }

#### PostgreSQL

    import (
        "github.com/jinzhu/gorm"
        _ "github.com/lib/pq"
    )
    func main() {
      db, err := gorm.Open("postgres", "user=gorm dbname=gorm sslmode=disable")
    }

#### Sqlite3

    import (
        "github.com/jinzhu/gorm"
        _ "github.com/mattn/go-sqlite3"
    )
    func main() {
      db, err := gorm.Open("sqlite3", "/tmp/gorm.db")
    }

#### Write Dialect for unsupported databases

GORM officially support above databases, for unsupported databaes, you could write a dialect for that.

Refer: https://github.com/jinzhu/gorm/blob/master/dialect.go

## Generic database object *sql.DB

*sql.DB

    // Get generic database object *sql.DB to use its functions
    db.DB()

    // Connection Pool
    db.DB().SetMaxIdleConns(10)
    db.DB().SetMaxOpenConns(100)

      // Ping
    db.DB().Ping()

## Migration

### Auto Migration

Automatically migrate your schema, to keep your schema update to date

WARNING AutoMigrate will ONLY create tables, columns and indexes if doesn't exist, WON'T change existing column's type or delete unused columns to protect your data

    db.AutoMigrate(&User{})

    db.AutoMigrate(&User{}, &Product{}, &Order{})

    // Add table suffix when create tables
    db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{})

### Has Table

    // Check if model `User`'s table has been created or not
    db.HasTable(&User{})

    // Check table `users` exists or not
    db.HasTable("users")

### Create Table

    db.CreateTable(&User{})

    db.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&User{})
    // will append "ENGINE=InnoDB" to the SQL statement when creating table `users`

### Drop table

    db.DropTable(&User{})

### ModifyColumn

Change column's type

    // change column description's data type to `text` for model `User`'s table
    db.Model(&User{}).ModifyColumn("description", "text")

### DropColumn

    db.Model(&User{}).DropColumn("description")

### Add Foreign Key

    // Add foreign key
    // 1st param : foreignkey field
    // 2nd param : destination table(id)
    // 3rd param : ONDELETE
    // 4th param : ONUPDATE
    db.Model(&User{}).AddForeignKey("city_id", "cities(id)", "RESTRICT", "RESTRICT")

### Indexes

    // Add index
    db.Model(&User{}).AddIndex("idx_user_name", "name")

    // Multiple column index
    db.Model(&User{}).AddIndex("idx_user_name_age", "name", "age")

    // Add unique index
    db.Model(&User{}).AddUniqueIndex("idx_user_name", "name")

    // Multiple column unique index
    db.Model(&User{}).AddUniqueIndex("idx_user_name_age", "name", "age")

    // Remove index
    db.Model(&User{}).RemoveIndex("idx_user_name")