models_test.go 8.29 KB
package orm

import (
	"fmt"
	"os"
	"strings"
	"time"

	_ "github.com/go-sql-driver/mysql"
	_ "github.com/lib/pq"
	_ "github.com/mattn/go-sqlite3"
)

type User struct {
	Id         int    `orm:"auto"`
	UserName   string `orm:"size(30);unique"`
	Email      string `orm:"size(100)"`
	Password   string `orm:"size(100)"`
	Status     int16
	IsStaff    bool
	IsActive   bool      `orm:"default(1)"`
	Created    time.Time `orm:"auto_now_add;type(date)"`
	Updated    time.Time `orm:"auto_now"`
	Profile    *Profile  `orm:"null;rel(one);on_delete(set_null)"`
	Posts      []*Post   `orm:"reverse(many)" json:"-"`
	ShouldSkip string    `orm:"-"`
}

func NewUser() *User {
	obj := new(User)
	return obj
}

type Profile struct {
	Id    int     `orm:"auto"`
	Age   int16   ``
	Money float64 ``
	User  *User   `orm:"reverse(one)" json:"-"`
}

func (u *Profile) TableName() string {
	return "user_profile"
}

func NewProfile() *Profile {
	obj := new(Profile)
	return obj
}

type Post struct {
	Id      int       `orm:"auto"`
	User    *User     `orm:"rel(fk)"` //
	Title   string    `orm:"size(60)"`
	Content string    ``
	Created time.Time `orm:"auto_now_add"`
	Updated time.Time `orm:"auto_now"`
	Tags    []*Tag    `orm:"rel(m2m)"`
}

func NewPost() *Post {
	obj := new(Post)
	return obj
}

type Tag struct {
	Id    int     `orm:"auto"`
	Name  string  `orm:"size(30)"`
	Posts []*Post `orm:"reverse(many)" json:"-"`
}

func NewTag() *Tag {
	obj := new(Tag)
	return obj
}

type Comment struct {
	Id      int       `orm:"auto"`
	Post    *Post     `orm:"rel(fk)"`
	Content string    ``
	Parent  *Comment  `orm:"null;rel(fk)"`
	Created time.Time `orm:"auto_now_add"`
}

func NewComment() *Comment {
	obj := new(Comment)
	return obj
}

var DBARGS = struct {
	Driver string
	Source string
	Debug  string
}{
	os.Getenv("ORM_DRIVER"),
	os.Getenv("ORM_SOURCE"),
	os.Getenv("ORM_DEBUG"),
}

var (
	IsMysql    = DBARGS.Driver == "mysql"
	IsSqlite   = DBARGS.Driver == "sqlite3"
	IsPostgres = DBARGS.Driver == "postgres"
)

var dORM Ormer

var initSQLs = map[string]string{
	"mysql": "DROP TABLE IF EXISTS `user_profile`;\n" +
		"DROP TABLE IF EXISTS `user`;\n" +
		"DROP TABLE IF EXISTS `post`;\n" +
		"DROP TABLE IF EXISTS `tag`;\n" +
		"DROP TABLE IF EXISTS `post_tags`;\n" +
		"DROP TABLE IF EXISTS `comment`;\n" +
		"CREATE TABLE `user_profile` (\n" +
		"    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,\n" +
		"    `age` smallint NOT NULL,\n" +
		"    `money` double precision NOT NULL\n" +
		") ENGINE=INNODB;\n" +
		"CREATE TABLE `user` (\n" +
		"    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,\n" +
		"    `user_name` varchar(30) NOT NULL UNIQUE,\n" +
		"    `email` varchar(100) NOT NULL,\n" +
		"    `password` varchar(100) NOT NULL,\n" +
		"    `status` smallint NOT NULL,\n" +
		"    `is_staff` bool NOT NULL,\n" +
		"    `is_active` bool NOT NULL,\n" +
		"    `created` date NOT NULL,\n" +
		"    `updated` datetime NOT NULL,\n" +
		"    `profile_id` integer\n" +
		") ENGINE=INNODB;\n" +
		"CREATE TABLE `post` (\n" +
		"    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,\n" +
		"    `user_id` integer NOT NULL,\n" +
		"    `title` varchar(60) NOT NULL,\n" +
		"    `content` longtext NOT NULL,\n" +
		"    `created` datetime NOT NULL,\n" +
		"    `updated` datetime NOT NULL\n" +
		") ENGINE=INNODB;\n" +
		"CREATE TABLE `tag` (\n" +
		"    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,\n" +
		"    `name` varchar(30) NOT NULL\n" +
		") ENGINE=INNODB;\n" +
		"CREATE TABLE `post_tags` (\n" +
		"    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,\n" +
		"    `post_id` integer NOT NULL,\n" +
		"    `tag_id` integer NOT NULL,\n" +
		"    UNIQUE (`post_id`, `tag_id`)\n" +
		") ENGINE=INNODB;\n" +
		"CREATE TABLE `comment` (\n" +
		"    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,\n" +
		"    `post_id` integer NOT NULL,\n" +
		"    `content` longtext NOT NULL,\n" +
		"    `parent_id` integer,\n" +
		"    `created` datetime NOT NULL\n" +
		") ENGINE=INNODB;\n" +
		"CREATE INDEX `user_141c6eec` ON `user` (`profile_id`);\n" +
		"CREATE INDEX `post_fbfc09f1` ON `post` (`user_id`);\n" +
		"CREATE INDEX `comment_699ae8ca` ON `comment` (`post_id`);\n" +
		"CREATE INDEX `comment_63f17a16` ON `comment` (`parent_id`);",

	"sqlite3": `
DROP TABLE IF EXISTS "user_profile";
DROP TABLE IF EXISTS "user";
DROP TABLE IF EXISTS "post";
DROP TABLE IF EXISTS "tag";
DROP TABLE IF EXISTS "post_tags";
DROP TABLE IF EXISTS "comment";
CREATE TABLE "user_profile" (
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "age" smallint NOT NULL,
    "money" real NOT NULL
);
CREATE TABLE "user" (
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "user_name" varchar(30) NOT NULL UNIQUE,
    "email" varchar(100) NOT NULL,
    "password" varchar(100) NOT NULL,
    "status" smallint NOT NULL,
    "is_staff" bool NOT NULL,
    "is_active" bool NOT NULL,
    "created" date NOT NULL,
    "updated" datetime NOT NULL,
    "profile_id" integer
);
CREATE TABLE "post" (
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "user_id" integer NOT NULL,
    "title" varchar(60) NOT NULL,
    "content" text NOT NULL,
    "created" datetime NOT NULL,
    "updated" datetime NOT NULL
);
CREATE TABLE "tag" (
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "name" varchar(30) NOT NULL
);
CREATE TABLE "post_tags" (
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "post_id" integer NOT NULL,
    "tag_id" integer NOT NULL,
    UNIQUE ("post_id", "tag_id")
);
CREATE TABLE "comment" (
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "post_id" integer NOT NULL,
    "content" text NOT NULL,
    "parent_id" integer,
    "created" datetime NOT NULL
);
CREATE INDEX "user_141c6eec" ON "user" ("profile_id");
CREATE INDEX "post_fbfc09f1" ON "post" ("user_id");
CREATE INDEX "comment_699ae8ca" ON "comment" ("post_id");
CREATE INDEX "comment_63f17a16" ON "comment" ("parent_id");
`,

	"postgres": `
DROP TABLE IF EXISTS "user_profile";
DROP TABLE IF EXISTS "user";
DROP TABLE IF EXISTS "post";
DROP TABLE IF EXISTS "tag";
DROP TABLE IF EXISTS "post_tags";
DROP TABLE IF EXISTS "comment";
CREATE TABLE "user_profile" (
    "id" serial NOT NULL PRIMARY KEY,
    "age" smallint NOT NULL,
    "money" double precision NOT NULL
);
CREATE TABLE "user" (
    "id" serial NOT NULL PRIMARY KEY,
    "user_name" varchar(30) NOT NULL UNIQUE,
    "email" varchar(100) NOT NULL,
    "password" varchar(100) NOT NULL,
    "status" smallint NOT NULL,
    "is_staff" boolean NOT NULL,
    "is_active" boolean NOT NULL,
    "created" date NOT NULL,
    "updated" timestamp with time zone NOT NULL,
    "profile_id" integer
);
CREATE TABLE "post" (
    "id" serial NOT NULL PRIMARY KEY,
    "user_id" integer NOT NULL,
    "title" varchar(60) NOT NULL,
    "content" text NOT NULL,
    "created" timestamp with time zone NOT NULL,
    "updated" timestamp with time zone NOT NULL
);
CREATE TABLE "tag" (
    "id" serial NOT NULL PRIMARY KEY,
    "name" varchar(30) NOT NULL
);
CREATE TABLE "post_tags" (
    "id" serial NOT NULL PRIMARY KEY,
    "post_id" integer NOT NULL,
    "tag_id" integer NOT NULL,
    UNIQUE ("post_id", "tag_id")
);
CREATE TABLE "comment" (
    "id" serial NOT NULL PRIMARY KEY,
    "post_id" integer NOT NULL,
    "content" text NOT NULL,
    "parent_id" integer,
    "created" timestamp with time zone NOT NULL
);
CREATE INDEX "user_profile_id" ON "user" ("profile_id");
CREATE INDEX "post_user_id" ON "post" ("user_id");
CREATE INDEX "comment_post_id" ON "comment" ("post_id");
CREATE INDEX "comment_parent_id" ON "comment" ("parent_id");
`}

func init() {
	RegisterModel(new(User))
	RegisterModel(new(Profile))
	RegisterModel(new(Post))
	RegisterModel(new(Tag))
	RegisterModel(new(Comment))

	Debug, _ = StrTo(DBARGS.Debug).Bool()

	if DBARGS.Driver == "" || DBARGS.Source == "" {
		fmt.Println(`need driver and source!

Default DB Drivers.

  driver: url
   mysql: https://github.com/go-sql-driver/mysql
 sqlite3: https://github.com/mattn/go-sqlite3
postgres: https://github.com/lib/pq

eg: mysql
ORM_DRIVER=mysql ORM_SOURCE="root:root@/my_db?charset=utf8" go test github.com/astaxie/beego/orm
`)
		os.Exit(2)
	}

	RegisterDataBase("default", DBARGS.Driver, DBARGS.Source, 20)

	BootStrap()

	dORM = NewOrm()

	queries := strings.Split(initSQLs[DBARGS.Driver], ";")

	for _, query := range queries {
		if strings.TrimSpace(query) == "" {
			continue
		}
		_, err := dORM.Raw(query).Exec()
		if err != nil {
			fmt.Println(err)
			os.Exit(2)
		}
	}
}