SQLStore: Support Upserting multiple rows. (#52228)
This will be used to reduce write load when the alerting system writes a large number of events.
This commit is contained in:
@@ -210,8 +210,16 @@ func (db *MySQLDialect) IsDeadlock(err error) bool {
|
||||
return db.isThisError(err, mysqlerr.ER_LOCK_DEADLOCK)
|
||||
}
|
||||
|
||||
// UpsertSQL returns the upsert sql statement for PostgreSQL dialect
|
||||
// UpsertSQL returns the upsert sql statement for MySQL dialect
|
||||
func (db *MySQLDialect) UpsertSQL(tableName string, keyCols, updateCols []string) string {
|
||||
q, _ := db.UpsertMultipleSQL(tableName, keyCols, updateCols, 1)
|
||||
return q
|
||||
}
|
||||
|
||||
func (db *MySQLDialect) UpsertMultipleSQL(tableName string, keyCols, updateCols []string, count int) (string, error) {
|
||||
if count < 1 {
|
||||
return "", fmt.Errorf("upsert statement must have count >= 1. Got %v", count)
|
||||
}
|
||||
columnsStr := strings.Builder{}
|
||||
colPlaceHoldersStr := strings.Builder{}
|
||||
setStr := strings.Builder{}
|
||||
@@ -226,13 +234,23 @@ func (db *MySQLDialect) UpsertSQL(tableName string, keyCols, updateCols []string
|
||||
setStr.WriteString(fmt.Sprintf("%s=VALUES(%s)%s", db.Quote(c), db.Quote(c), separator))
|
||||
}
|
||||
|
||||
s := fmt.Sprintf(`INSERT INTO %s (%s) VALUES (%s) ON DUPLICATE KEY UPDATE %s`,
|
||||
valuesStr := strings.Builder{}
|
||||
separator = ", "
|
||||
colPlaceHolders := colPlaceHoldersStr.String()
|
||||
for i := 0; i < count; i++ {
|
||||
if i == count-1 {
|
||||
separator = ""
|
||||
}
|
||||
valuesStr.WriteString(fmt.Sprintf("(%s)%s", colPlaceHolders, separator))
|
||||
}
|
||||
|
||||
s := fmt.Sprintf(`INSERT INTO %s (%s) VALUES %s ON DUPLICATE KEY UPDATE %s`,
|
||||
tableName,
|
||||
columnsStr.String(),
|
||||
colPlaceHoldersStr.String(),
|
||||
valuesStr.String(),
|
||||
setStr.String(),
|
||||
)
|
||||
return s
|
||||
return s, nil
|
||||
}
|
||||
|
||||
func (db *MySQLDialect) Lock(cfg LockCfg) error {
|
||||
|
||||
Reference in New Issue
Block a user