Browse Source

reduce sessions on Sync

xormplus 8 years ago
parent
commit
877228f7a3
2 changed files with 75 additions and 142 deletions
  1. 11 36
      engine.go
  2. 64 106
      session_schema.go

+ 11 - 36
engine.go

@@ -262,7 +262,6 @@ func (engine *Engine) Close() error {
 func (engine *Engine) Ping() error {
 func (engine *Engine) Ping() error {
 	session := engine.NewSession()
 	session := engine.NewSession()
 	defer session.Close()
 	defer session.Close()
-	engine.logger.Infof("PING DATABASE %v", engine.DriverName())
 	return session.Ping()
 	return session.Ping()
 }
 }
 
 
@@ -1224,6 +1223,9 @@ func (engine *Engine) ClearCache(beans ...interface{}) error {
 // table, column, index, unique. but will not delete or change anything.
 // table, column, index, unique. but will not delete or change anything.
 // If you change some field, you should change the database manually.
 // If you change some field, you should change the database manually.
 func (engine *Engine) Sync(beans ...interface{}) error {
 func (engine *Engine) Sync(beans ...interface{}) error {
+	session := engine.NewSession()
+	defer session.Close()
+
 	for _, bean := range beans {
 	for _, bean := range beans {
 		v := rValue(bean)
 		v := rValue(bean)
 		tableName := engine.tbName(v)
 		tableName := engine.tbName(v)
@@ -1232,14 +1234,12 @@ func (engine *Engine) Sync(beans ...interface{}) error {
 			return err
 			return err
 		}
 		}
 
 
-		s := engine.NewSession()
-		defer s.Close()
-		isExist, err := s.Table(bean).isTableExist(tableName)
+		isExist, err := session.Table(bean).isTableExist(tableName)
 		if err != nil {
 		if err != nil {
 			return err
 			return err
 		}
 		}
 		if !isExist {
 		if !isExist {
-			err = engine.CreateTables(bean)
+			err = session.createTable(bean)
 			if err != nil {
 			if err != nil {
 				return err
 				return err
 			}
 			}
@@ -1250,11 +1250,11 @@ func (engine *Engine) Sync(beans ...interface{}) error {
 		  }*/
 		  }*/
 		var isEmpty bool
 		var isEmpty bool
 		if isEmpty {
 		if isEmpty {
-			err = engine.DropTables(bean)
+			err = session.dropTable(bean)
 			if err != nil {
 			if err != nil {
 				return err
 				return err
 			}
 			}
-			err = engine.CreateTables(bean)
+			err = session.createTable(bean)
 			if err != nil {
 			if err != nil {
 				return err
 				return err
 			}
 			}
@@ -1265,8 +1265,6 @@ func (engine *Engine) Sync(beans ...interface{}) error {
 					return err
 					return err
 				}
 				}
 				if !isExist {
 				if !isExist {
-					session := engine.NewSession()
-					defer session.Close()
 					if err := session.statement.setRefValue(v); err != nil {
 					if err := session.statement.setRefValue(v); err != nil {
 						return err
 						return err
 					}
 					}
@@ -1278,8 +1276,6 @@ func (engine *Engine) Sync(beans ...interface{}) error {
 			}
 			}
 
 
 			for name, index := range table.Indexes {
 			for name, index := range table.Indexes {
-				session := engine.NewSession()
-				defer session.Close()
 				if err := session.statement.setRefValue(v); err != nil {
 				if err := session.statement.setRefValue(v); err != nil {
 					return err
 					return err
 				}
 				}
@@ -1289,8 +1285,6 @@ func (engine *Engine) Sync(beans ...interface{}) error {
 						return err
 						return err
 					}
 					}
 					if !isExist {
 					if !isExist {
-						session := engine.NewSession()
-						defer session.Close()
 						if err := session.statement.setRefValue(v); err != nil {
 						if err := session.statement.setRefValue(v); err != nil {
 							return err
 							return err
 						}
 						}
@@ -1306,8 +1300,6 @@ func (engine *Engine) Sync(beans ...interface{}) error {
 						return err
 						return err
 					}
 					}
 					if !isExist {
 					if !isExist {
-						session := engine.NewSession()
-						defer session.Close()
 						if err := session.statement.setRefValue(v); err != nil {
 						if err := session.statement.setRefValue(v); err != nil {
 							return err
 							return err
 						}
 						}
@@ -1333,23 +1325,6 @@ func (engine *Engine) Sync2(beans ...interface{}) error {
 	return s.Sync2(beans...)
 	return s.Sync2(beans...)
 }
 }
 
 
-// Drop all mapped table
-func (engine *Engine) dropAll() error {
-	session := engine.NewSession()
-	defer session.Close()
-
-	err := session.Begin()
-	if err != nil {
-		return err
-	}
-	err = session.dropAll()
-	if err != nil {
-		session.Rollback()
-		return err
-	}
-	return session.Commit()
-}
-
 // CreateTables create tabls according bean
 // CreateTables create tabls according bean
 func (engine *Engine) CreateTables(beans ...interface{}) error {
 func (engine *Engine) CreateTables(beans ...interface{}) error {
 	session := engine.NewSession()
 	session := engine.NewSession()
@@ -1361,7 +1336,7 @@ func (engine *Engine) CreateTables(beans ...interface{}) error {
 	}
 	}
 
 
 	for _, bean := range beans {
 	for _, bean := range beans {
-		err = session.CreateTable(bean)
+		err = session.createTable(bean)
 		if err != nil {
 		if err != nil {
 			session.Rollback()
 			session.Rollback()
 			return err
 			return err
@@ -1381,7 +1356,7 @@ func (engine *Engine) DropTables(beans ...interface{}) error {
 	}
 	}
 
 
 	for _, bean := range beans {
 	for _, bean := range beans {
-		err = session.DropTable(bean)
+		err = session.dropTable(bean)
 		if err != nil {
 		if err != nil {
 			session.Rollback()
 			session.Rollback()
 			return err
 			return err
@@ -1491,10 +1466,10 @@ func (engine *Engine) Rows(bean interface{}) (*Rows, error) {
 }
 }
 
 
 // Count counts the records. bean's non-empty fields are conditions.
 // Count counts the records. bean's non-empty fields are conditions.
-func (engine *Engine) Count(bean interface{}) (int64, error) {
+func (engine *Engine) Count(bean ...interface{}) (int64, error) {
 	session := engine.NewSession()
 	session := engine.NewSession()
 	defer session.Close()
 	defer session.Close()
-	return session.Count(bean)
+	return session.Count(bean...)
 }
 }
 
 
 // Sum sum the records by some column. bean's non-empty fields are conditions.
 // Sum sum the records by some column. bean's non-empty fields are conditions.

+ 64 - 106
session_schema.go

@@ -21,36 +21,47 @@ func (session *Session) Ping() error {
 		defer session.Close()
 		defer session.Close()
 	}
 	}
 
 
+	session.engine.logger.Infof("PING DATABASE %v", session.engine.DriverName())
 	return session.DB().Ping()
 	return session.DB().Ping()
 }
 }
 
 
 // CreateTable create a table according a bean
 // CreateTable create a table according a bean
 func (session *Session) CreateTable(bean interface{}) error {
 func (session *Session) CreateTable(bean interface{}) error {
+	if session.isAutoClose {
+		defer session.Close()
+	}
+
+	return session.createTable(bean)
+}
+
+func (session *Session) createTable(bean interface{}) error {
+	defer session.resetStatement()
 	v := rValue(bean)
 	v := rValue(bean)
 	if err := session.statement.setRefValue(v); err != nil {
 	if err := session.statement.setRefValue(v); err != nil {
 		return err
 		return err
 	}
 	}
 
 
-	defer session.resetStatement()
+	sqlStr := session.statement.genCreateTableSQL()
+	_, err := session.exec(sqlStr)
+	return err
+}
+
+// CreateIndexes create indexes
+func (session *Session) CreateIndexes(bean interface{}) error {
 	if session.isAutoClose {
 	if session.isAutoClose {
 		defer session.Close()
 		defer session.Close()
 	}
 	}
 
 
-	return session.createOneTable()
+	return session.createIndexes(bean)
 }
 }
 
 
-// CreateIndexes create indexes
-func (session *Session) CreateIndexes(bean interface{}) error {
+func (session *Session) createIndexes(bean interface{}) error {
+	defer session.resetStatement()
 	v := rValue(bean)
 	v := rValue(bean)
 	if err := session.statement.setRefValue(v); err != nil {
 	if err := session.statement.setRefValue(v); err != nil {
 		return err
 		return err
 	}
 	}
 
 
-	defer session.resetStatement()
-	if session.isAutoClose {
-		defer session.Close()
-	}
-
 	sqls := session.statement.genIndexSQL()
 	sqls := session.statement.genIndexSQL()
 	for _, sqlStr := range sqls {
 	for _, sqlStr := range sqls {
 		_, err := session.exec(sqlStr)
 		_, err := session.exec(sqlStr)
@@ -63,14 +74,17 @@ func (session *Session) CreateIndexes(bean interface{}) error {
 
 
 // CreateUniques create uniques
 // CreateUniques create uniques
 func (session *Session) CreateUniques(bean interface{}) error {
 func (session *Session) CreateUniques(bean interface{}) error {
-	v := rValue(bean)
-	if err := session.statement.setRefValue(v); err != nil {
-		return err
+	if session.isAutoClose {
+		defer session.Close()
 	}
 	}
+	return session.createUniques(bean)
+}
 
 
+func (session *Session) createUniques(bean interface{}) error {
 	defer session.resetStatement()
 	defer session.resetStatement()
-	if session.isAutoClose {
-		defer session.Close()
+	v := rValue(bean)
+	if err := session.statement.setRefValue(v); err != nil {
+		return err
 	}
 	}
 
 
 	sqls := session.statement.genUniqueSQL()
 	sqls := session.statement.genUniqueSQL()
@@ -83,42 +97,22 @@ func (session *Session) CreateUniques(bean interface{}) error {
 	return nil
 	return nil
 }
 }
 
 
-func (session *Session) createOneTable() error {
-	sqlStr := session.statement.genCreateTableSQL()
-	_, err := session.exec(sqlStr)
-	return err
-}
-
-// to be deleted
-func (session *Session) createAll() error {
+// DropIndexes drop indexes
+func (session *Session) DropIndexes(bean interface{}) error {
 	if session.isAutoClose {
 	if session.isAutoClose {
 		defer session.Close()
 		defer session.Close()
 	}
 	}
 
 
-	for _, table := range session.engine.Tables {
-		session.statement.RefTable = table
-		session.statement.tableName = table.Name
-		err := session.createOneTable()
-		session.resetStatement()
-		if err != nil {
-			return err
-		}
-	}
-	return nil
+	return session.dropIndexes(bean)
 }
 }
 
 
-// DropIndexes drop indexes
-func (session *Session) DropIndexes(bean interface{}) error {
+func (session *Session) dropIndexes(bean interface{}) error {
+	defer session.resetStatement()
 	v := rValue(bean)
 	v := rValue(bean)
 	if err := session.statement.setRefValue(v); err != nil {
 	if err := session.statement.setRefValue(v); err != nil {
 		return err
 		return err
 	}
 	}
 
 
-	defer session.resetStatement()
-	if session.isAutoClose {
-		defer session.Close()
-	}
-
 	sqls := session.statement.genDelIndexSQL()
 	sqls := session.statement.genDelIndexSQL()
 	for _, sqlStr := range sqls {
 	for _, sqlStr := range sqls {
 		_, err := session.exec(sqlStr)
 		_, err := session.exec(sqlStr)
@@ -131,6 +125,15 @@ func (session *Session) DropIndexes(bean interface{}) error {
 
 
 // DropTable drop table will drop table if exist, if drop failed, it will return error
 // DropTable drop table will drop table if exist, if drop failed, it will return error
 func (session *Session) DropTable(beanOrTableName interface{}) error {
 func (session *Session) DropTable(beanOrTableName interface{}) error {
+	if session.isAutoClose {
+		defer session.Close()
+	}
+
+	return session.dropTable(beanOrTableName)
+}
+
+func (session *Session) dropTable(beanOrTableName interface{}) error {
+	defer session.resetStatement()
 	tableName, err := session.engine.tableName(beanOrTableName)
 	tableName, err := session.engine.tableName(beanOrTableName)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
@@ -156,6 +159,10 @@ func (session *Session) DropTable(beanOrTableName interface{}) error {
 
 
 // IsTableExist if a table is exist
 // IsTableExist if a table is exist
 func (session *Session) IsTableExist(beanOrTableName interface{}) (bool, error) {
 func (session *Session) IsTableExist(beanOrTableName interface{}) (bool, error) {
+	if session.isAutoClose {
+		defer session.Close()
+	}
+
 	tableName, err := session.engine.tableName(beanOrTableName)
 	tableName, err := session.engine.tableName(beanOrTableName)
 	if err != nil {
 	if err != nil {
 		return false, err
 		return false, err
@@ -166,9 +173,6 @@ func (session *Session) IsTableExist(beanOrTableName interface{}) (bool, error)
 
 
 func (session *Session) isTableExist(tableName string) (bool, error) {
 func (session *Session) isTableExist(tableName string) (bool, error) {
 	defer session.resetStatement()
 	defer session.resetStatement()
-	if session.isAutoClose {
-		defer session.Close()
-	}
 	sqlStr, args := session.engine.dialect.TableCheckSql(tableName)
 	sqlStr, args := session.engine.dialect.TableCheckSql(tableName)
 	results, err := session.query(sqlStr, args...)
 	results, err := session.query(sqlStr, args...)
 	return len(results) > 0, err
 	return len(results) > 0, err
@@ -180,6 +184,9 @@ func (session *Session) IsTableEmpty(bean interface{}) (bool, error) {
 	t := v.Type()
 	t := v.Type()
 
 
 	if t.Kind() == reflect.String {
 	if t.Kind() == reflect.String {
+		if session.isAutoClose {
+			defer session.Close()
+		}
 		return session.isTableEmpty(bean.(string))
 		return session.isTableEmpty(bean.(string))
 	} else if t.Kind() == reflect.Struct {
 	} else if t.Kind() == reflect.Struct {
 		rows, err := session.Count(bean)
 		rows, err := session.Count(bean)
@@ -190,9 +197,6 @@ func (session *Session) IsTableEmpty(bean interface{}) (bool, error) {
 
 
 func (session *Session) isTableEmpty(tableName string) (bool, error) {
 func (session *Session) isTableEmpty(tableName string) (bool, error) {
 	defer session.resetStatement()
 	defer session.resetStatement()
-	if session.isAutoClose {
-		defer session.Close()
-	}
 
 
 	var total int64
 	var total int64
 	sqlStr := fmt.Sprintf("select count(*) from %s", session.engine.Quote(tableName))
 	sqlStr := fmt.Sprintf("select count(*) from %s", session.engine.Quote(tableName))
@@ -208,28 +212,9 @@ func (session *Session) isTableEmpty(tableName string) (bool, error) {
 	return total == 0, nil
 	return total == 0, nil
 }
 }
 
 
-func (session *Session) isIndexExist(tableName, idxName string, unique bool) (bool, error) {
-	defer session.resetStatement()
-	if session.isAutoClose {
-		defer session.Close()
-	}
-	var idx string
-	if unique {
-		idx = uniqueName(tableName, idxName)
-	} else {
-		idx = indexName(tableName, idxName)
-	}
-	sqlStr, args := session.engine.dialect.IndexCheckSql(tableName, idx)
-	results, err := session.query(sqlStr, args...)
-	return len(results) > 0, err
-}
-
 // find if index is exist according cols
 // find if index is exist according cols
 func (session *Session) isIndexExist2(tableName string, cols []string, unique bool) (bool, error) {
 func (session *Session) isIndexExist2(tableName string, cols []string, unique bool) (bool, error) {
 	defer session.resetStatement()
 	defer session.resetStatement()
-	if session.isAutoClose {
-		defer session.Close()
-	}
 
 
 	indexes, err := session.engine.dialect.GetIndexes(tableName)
 	indexes, err := session.engine.dialect.GetIndexes(tableName)
 	if err != nil {
 	if err != nil {
@@ -249,9 +234,6 @@ func (session *Session) isIndexExist2(tableName string, cols []string, unique bo
 
 
 func (session *Session) addColumn(colName string) error {
 func (session *Session) addColumn(colName string) error {
 	defer session.resetStatement()
 	defer session.resetStatement()
-	if session.isAutoClose {
-		defer session.Close()
-	}
 
 
 	col := session.statement.RefTable.GetColumn(colName)
 	col := session.statement.RefTable.GetColumn(colName)
 	sql, args := session.statement.genAddColumnStr(col)
 	sql, args := session.statement.genAddColumnStr(col)
@@ -261,9 +243,7 @@ func (session *Session) addColumn(colName string) error {
 
 
 func (session *Session) addIndex(tableName, idxName string) error {
 func (session *Session) addIndex(tableName, idxName string) error {
 	defer session.resetStatement()
 	defer session.resetStatement()
-	if session.isAutoClose {
-		defer session.Close()
-	}
+
 	index := session.statement.RefTable.Indexes[idxName]
 	index := session.statement.RefTable.Indexes[idxName]
 	sqlStr := session.engine.dialect.CreateIndexSql(tableName, index)
 	sqlStr := session.engine.dialect.CreateIndexSql(tableName, index)
 
 
@@ -273,38 +253,22 @@ func (session *Session) addIndex(tableName, idxName string) error {
 
 
 func (session *Session) addUnique(tableName, uqeName string) error {
 func (session *Session) addUnique(tableName, uqeName string) error {
 	defer session.resetStatement()
 	defer session.resetStatement()
-	if session.isAutoClose {
-		defer session.Close()
-	}
+
 	index := session.statement.RefTable.Indexes[uqeName]
 	index := session.statement.RefTable.Indexes[uqeName]
 	sqlStr := session.engine.dialect.CreateIndexSql(tableName, index)
 	sqlStr := session.engine.dialect.CreateIndexSql(tableName, index)
 	_, err := session.exec(sqlStr)
 	_, err := session.exec(sqlStr)
 	return err
 	return err
 }
 }
 
 
-// To be deleted
-func (session *Session) dropAll() error {
-	defer session.resetStatement()
-	if session.isAutoClose {
-		defer session.Close()
-	}
-
-	for _, table := range session.engine.Tables {
-		session.statement.Init()
-		session.statement.RefTable = table
-		sqlStr := session.engine.Dialect().DropTableSql(session.statement.TableName())
-		_, err := session.exec(sqlStr)
-		if err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
 // Sync2 synchronize structs to database tables
 // Sync2 synchronize structs to database tables
 func (session *Session) Sync2(beans ...interface{}) error {
 func (session *Session) Sync2(beans ...interface{}) error {
 	engine := session.engine
 	engine := session.engine
 
 
+	if session.isAutoClose {
+		session.isAutoClose = false
+		defer session.Close()
+	}
+
 	tables, err := engine.DBMetas()
 	tables, err := engine.DBMetas()
 	if err != nil {
 	if err != nil {
 		return err
 		return err
@@ -330,17 +294,17 @@ func (session *Session) Sync2(beans ...interface{}) error {
 		}
 		}
 
 
 		if oriTable == nil {
 		if oriTable == nil {
-			err = session.StoreEngine(session.statement.StoreEngine).CreateTable(bean)
+			err = session.StoreEngine(session.statement.StoreEngine).createTable(bean)
 			if err != nil {
 			if err != nil {
 				return err
 				return err
 			}
 			}
 
 
-			err = session.CreateUniques(bean)
+			err = session.createUniques(bean)
 			if err != nil {
 			if err != nil {
 				return err
 				return err
 			}
 			}
 
 
-			err = session.CreateIndexes(bean)
+			err = session.createIndexes(bean)
 			if err != nil {
 			if err != nil {
 				return err
 				return err
 			}
 			}
@@ -365,7 +329,7 @@ func (session *Session) Sync2(beans ...interface{}) error {
 								engine.dialect.DBType() == core.POSTGRES {
 								engine.dialect.DBType() == core.POSTGRES {
 								engine.logger.Infof("Table %s column %s change type from %s to %s\n",
 								engine.logger.Infof("Table %s column %s change type from %s to %s\n",
 									tbName, col.Name, curType, expectedType)
 									tbName, col.Name, curType, expectedType)
-								_, err = engine.Exec(engine.dialect.ModifyColumnSql(table.Name, col))
+								_, err = session.exec(engine.dialect.ModifyColumnSql(table.Name, col))
 							} else {
 							} else {
 								engine.logger.Warnf("Table %s column %s db type is %s, struct type is %s\n",
 								engine.logger.Warnf("Table %s column %s db type is %s, struct type is %s\n",
 									tbName, col.Name, curType, expectedType)
 									tbName, col.Name, curType, expectedType)
@@ -375,7 +339,7 @@ func (session *Session) Sync2(beans ...interface{}) error {
 								if oriCol.Length < col.Length {
 								if oriCol.Length < col.Length {
 									engine.logger.Infof("Table %s column %s change type from varchar(%d) to varchar(%d)\n",
 									engine.logger.Infof("Table %s column %s change type from varchar(%d) to varchar(%d)\n",
 										tbName, col.Name, oriCol.Length, col.Length)
 										tbName, col.Name, oriCol.Length, col.Length)
-									_, err = engine.Exec(engine.dialect.ModifyColumnSql(table.Name, col))
+									_, err = session.exec(engine.dialect.ModifyColumnSql(table.Name, col))
 								}
 								}
 							}
 							}
 						} else {
 						} else {
@@ -389,7 +353,7 @@ func (session *Session) Sync2(beans ...interface{}) error {
 							if oriCol.Length < col.Length {
 							if oriCol.Length < col.Length {
 								engine.logger.Infof("Table %s column %s change type from varchar(%d) to varchar(%d)\n",
 								engine.logger.Infof("Table %s column %s change type from varchar(%d) to varchar(%d)\n",
 									tbName, col.Name, oriCol.Length, col.Length)
 									tbName, col.Name, oriCol.Length, col.Length)
-								_, err = engine.Exec(engine.dialect.ModifyColumnSql(table.Name, col))
+								_, err = session.exec(engine.dialect.ModifyColumnSql(table.Name, col))
 							}
 							}
 						}
 						}
 					}
 					}
@@ -402,10 +366,8 @@ func (session *Session) Sync2(beans ...interface{}) error {
 							tbName, col.Name, oriCol.Nullable, col.Nullable)
 							tbName, col.Name, oriCol.Nullable, col.Nullable)
 					}
 					}
 				} else {
 				} else {
-					session := engine.NewSession()
 					session.statement.RefTable = table
 					session.statement.RefTable = table
 					session.statement.tableName = tbName
 					session.statement.tableName = tbName
-					defer session.Close()
 					err = session.addColumn(col.Name)
 					err = session.addColumn(col.Name)
 				}
 				}
 				if err != nil {
 				if err != nil {
@@ -429,7 +391,7 @@ func (session *Session) Sync2(beans ...interface{}) error {
 				if oriIndex != nil {
 				if oriIndex != nil {
 					if oriIndex.Type != index.Type {
 					if oriIndex.Type != index.Type {
 						sql := engine.dialect.DropIndexSql(tbName, oriIndex)
 						sql := engine.dialect.DropIndexSql(tbName, oriIndex)
-						_, err = engine.Exec(sql)
+						_, err = session.exec(sql)
 						if err != nil {
 						if err != nil {
 							return err
 							return err
 						}
 						}
@@ -445,7 +407,7 @@ func (session *Session) Sync2(beans ...interface{}) error {
 			for name2, index2 := range oriTable.Indexes {
 			for name2, index2 := range oriTable.Indexes {
 				if _, ok := foundIndexNames[name2]; !ok {
 				if _, ok := foundIndexNames[name2]; !ok {
 					sql := engine.dialect.DropIndexSql(tbName, index2)
 					sql := engine.dialect.DropIndexSql(tbName, index2)
-					_, err = engine.Exec(sql)
+					_, err = session.exec(sql)
 					if err != nil {
 					if err != nil {
 						return err
 						return err
 					}
 					}
@@ -454,16 +416,12 @@ func (session *Session) Sync2(beans ...interface{}) error {
 
 
 			for name, index := range addedNames {
 			for name, index := range addedNames {
 				if index.Type == core.UniqueType {
 				if index.Type == core.UniqueType {
-					session := engine.NewSession()
 					session.statement.RefTable = table
 					session.statement.RefTable = table
 					session.statement.tableName = tbName
 					session.statement.tableName = tbName
-					defer session.Close()
 					err = session.addUnique(tbName, name)
 					err = session.addUnique(tbName, name)
 				} else if index.Type == core.IndexType {
 				} else if index.Type == core.IndexType {
-					session := engine.NewSession()
 					session.statement.RefTable = table
 					session.statement.RefTable = table
 					session.statement.tableName = tbName
 					session.statement.tableName = tbName
-					defer session.Close()
 					err = session.addIndex(tbName, name)
 					err = session.addIndex(tbName, name)
 				}
 				}
 				if err != nil {
 				if err != nil {