Merge b38f14bfbd21d77faea7ac9b052faed8898d93ee into 0e22837c043e3f3405020fbb11ed4115accb5aaf
This commit is contained in:
commit
ee36367590
@ -106,6 +106,10 @@ db, err := gorm.Open("postgres", "user=gorm dbname=gorm sslmode=disable")
|
|||||||
// db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True")
|
// db, err := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True")
|
||||||
// db, err := gorm.Open("sqlite3", "/tmp/gorm.db")
|
// db, err := gorm.Open("sqlite3", "/tmp/gorm.db")
|
||||||
|
|
||||||
|
// You can also use an existing database connection handle
|
||||||
|
// dbSql, _ := sql.Open("postgres", "user=gorm dbname=gorm sslmode=disable")
|
||||||
|
// db := gorm.Open("postgres", dbSql)
|
||||||
|
|
||||||
// Get database connection handle [*sql.DB](http://golang.org/pkg/database/sql/#DB)
|
// Get database connection handle [*sql.DB](http://golang.org/pkg/database/sql/#DB)
|
||||||
db.DB()
|
db.DB()
|
||||||
|
|
||||||
|
45
main.go
45
main.go
@ -35,28 +35,41 @@ type DB struct {
|
|||||||
values map[string]interface{}
|
values map[string]interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func Open(dialect string, drivesources ...string) (DB, error) {
|
func Open(dialect string, args ...interface{}) (DB, error) {
|
||||||
var db DB
|
var db DB
|
||||||
var err error
|
var err error
|
||||||
var driver = dialect
|
|
||||||
var source string
|
var source string
|
||||||
|
var dbSql sqlCommon
|
||||||
|
|
||||||
if len(drivesources) == 0 {
|
if len(args) == 0 {
|
||||||
err = errors.New("invalid database source")
|
err = errors.New("invalid database source")
|
||||||
} else {
|
|
||||||
if len(drivesources) == 1 {
|
|
||||||
source = drivesources[0]
|
|
||||||
} else if len(drivesources) >= 2 {
|
|
||||||
driver = drivesources[0]
|
|
||||||
source = drivesources[1]
|
|
||||||
}
|
|
||||||
|
|
||||||
db = DB{dialect: NewDialect(dialect), tagIdentifier: "sql",
|
|
||||||
logger: defaultLogger, callback: DefaultCallback, source: source,
|
|
||||||
values: map[string]interface{}{}}
|
|
||||||
db.db, err = sql.Open(driver, source)
|
|
||||||
db.parent = &db
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch value := args[0].(type) {
|
||||||
|
case string:
|
||||||
|
var driver = dialect
|
||||||
|
if len(args) == 1 {
|
||||||
|
source = value
|
||||||
|
} else if len(args) >= 2 {
|
||||||
|
driver = value
|
||||||
|
source = args[1].(string)
|
||||||
|
}
|
||||||
|
dbSql, err = sql.Open(driver, source)
|
||||||
|
case sqlCommon:
|
||||||
|
if reflect.TypeOf(value).Kind() == reflect.Ptr {
|
||||||
|
source = reflect.ValueOf(value).Elem().FieldByName("dsn").String()
|
||||||
|
} else {
|
||||||
|
source = reflect.ValueOf(value).FieldByName("dsn").String()
|
||||||
|
}
|
||||||
|
dbSql = value
|
||||||
|
}
|
||||||
|
|
||||||
|
db = DB{dialect: NewDialect(dialect), tagIdentifier: "sql",
|
||||||
|
logger: defaultLogger, callback: DefaultCallback, source: source,
|
||||||
|
values: map[string]interface{}{}}
|
||||||
|
db.db = dbSql
|
||||||
|
db.parent = &db
|
||||||
|
|
||||||
return db, err
|
return db, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
16
main_test.go
16
main_test.go
@ -554,6 +554,22 @@ func TestCompatibilityMode(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestOpenExistingDB(t *testing.T) {
|
||||||
|
DB.Save(&User{Name: "jnfeinstein"})
|
||||||
|
dialect := os.Getenv("GORM_DIALECT")
|
||||||
|
|
||||||
|
db, err := gorm.Open(dialect, DB.DB())
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Should have wrapped the existing DB connection")
|
||||||
|
}
|
||||||
|
|
||||||
|
var user User
|
||||||
|
if db.Where("name = ?", "jnfeinstein").First(&user).Error == gorm.RecordNotFound {
|
||||||
|
t.Errorf("Should have found existing record")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func BenchmarkGorm(b *testing.B) {
|
func BenchmarkGorm(b *testing.B) {
|
||||||
b.N = 2000
|
b.N = 2000
|
||||||
for x := 0; x < b.N; x++ {
|
for x := 0; x < b.N; x++ {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user