| 
					
				 | 
			
			
				@@ -604,14 +604,44 @@ func (d *DB) ExecContext(ctx context.Context, query string, args ...interface{}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Exec exec, with named args 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (d *DB) NamedExec(query string, args interface{}) (LastInsertId, RowsAffected int64, err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	err = d.Connect() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	defer d.Close() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var rs sql.Result 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if rs, err = d.conn.NamedExec(query, args); err == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		LastInsertId, _ = rs.LastInsertId() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		RowsAffected, _ = rs.RowsAffected() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// NamedExecContext exec, with named args 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (d *DB) NamedExecContext(ctx context.Context, query string, args interface{}) (LastInsertId, RowsAffected int64, err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	err = d.ConnectContext(ctx) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	defer d.Close() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var rs sql.Result 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if rs, err = d.conn.NamedExecContext(ctx, query, args); err == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		LastInsertId, _ = rs.LastInsertId() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		RowsAffected, _ = rs.RowsAffected() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Limit MySQL limit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (d *DB) Limit(page, pagesize int) string { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// MySQL limit 0, size 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if d.Driver == `mysql` { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		return fmt.Sprintf(" limit %d, %d", (page-1)*pagesize, pagesize) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return fmt.Sprintf(" LIMIT %d, %d", (page-1)*pagesize, pagesize) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	// // PostgreSQL limit size offset 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return fmt.Sprintf(" limit %d offset %d", pagesize, (page-1)*pagesize) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return fmt.Sprintf(" LIMIT %d OFFSET %d", pagesize, (page-1)*pagesize) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Commit commits the transaction. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -624,8 +654,8 @@ func (t *Tx) Rollback() error { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return t.tx.Rollback() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// Exec executes a query that doesn't return rows. For example: an INSERT and UPDATE. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-func (t *Tx) Exec(query string, args interface{}) (LastInsertId, RowsAffected int64, err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// NamedExec executes a query that doesn't return rows. For example: an INSERT and UPDATE. with named args 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (t *Tx) NamedExec(query string, args interface{}) (LastInsertId, RowsAffected int64, err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if rs, err := t.tx.NamedExec(query, args); err == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		RowsAffected, _ = rs.RowsAffected() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		LastInsertId, _ = rs.LastInsertId() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -633,6 +663,81 @@ func (t *Tx) Exec(query string, args interface{}) (LastInsertId, RowsAffected in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// NamedExecContext executes a query that doesn't return rows. For example: an INSERT and UPDATE. with named args 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (t *Tx) NamedExecContext(ctx context.Context, query string, args interface{}) (LastInsertId, RowsAffected int64, err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if rs, err := t.tx.NamedExecContext(ctx, query, args); err == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		RowsAffected, _ = rs.RowsAffected() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		LastInsertId, _ = rs.LastInsertId() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Exec executes a query that doesn't return rows. For example: an INSERT and UPDATE. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (t *Tx) Exec(query string, args ...interface{}) (LastInsertId, RowsAffected int64, err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if rs, err := t.tx.Exec(query, args...); err == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		RowsAffected, _ = rs.RowsAffected() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		LastInsertId, _ = rs.LastInsertId() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// ExecContext executes a query that doesn't return rows. For example: an INSERT and UPDATE. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (t *Tx) ExecContext(ctx context.Context, query string, args ...interface{}) (LastInsertId, RowsAffected int64, err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if rs, err := t.tx.ExecContext(ctx, query, args...); err == nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		RowsAffected, _ = rs.RowsAffected() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		LastInsertId, _ = rs.LastInsertId() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Query executes a query that returns rows, typically a SELECT. with named args 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (t *Tx) Query(dest interface{}, query string, args interface{}) (err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	nstmt, err := t.tx.PrepareNamed(query) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	defer nstmt.Close() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	err = nstmt.Select(dest, args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// QueryContext executes a query that returns rows, typically a SELECT. with named args 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (t *Tx) QueryContext(ctx context.Context, dest interface{}, query string, args interface{}) (err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	nstmt, err := t.tx.PrepareNamedContext(ctx, query) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	defer nstmt.Close() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	err = nstmt.SelectContext(ctx, dest, args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// QueryRow executes a query that returns rows, typically a SELECT. with named args 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (t *Tx) QueryRow(dest interface{}, query string, args interface{}) (err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	nstmt, err := t.tx.PrepareNamed(query) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	defer nstmt.Close() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	err = nstmt.Get(dest, args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// QueryRowContext get row with named args 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func (t *Tx) QueryRowContext(ctx context.Context, dest interface{}, query string, args interface{}) (err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	nstmt, err := t.tx.PrepareNamedContext(ctx, query) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	defer nstmt.Close() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	err = nstmt.GetContext(ctx, dest, args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Ping ping connect 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func Ping() (err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	defaultDB.conn, err = connect() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -834,3 +939,25 @@ func ExecContext(ctx context.Context, query string, args ...interface{}) (LastIn 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	LastInsertId, RowsAffected, err = defaultDB.ExecContext(ctx, query, args...) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// NamedExec exec with named args 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func NamedExec(query string, args interface{}) (LastInsertId, RowsAffected int64, err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	defaultDB.conn, err = connect() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	LastInsertId, RowsAffected, err = defaultDB.NamedExec(query, args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// NamedExecContext exec with named args 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+func NamedExecContext(ctx context.Context, query string, args interface{}) (LastInsertId, RowsAffected int64, err error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	defaultDB.conn, err = connectContext(ctx) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	LastInsertId, RowsAffected, err = defaultDB.NamedExecContext(ctx, query, args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |