Генерация SQL-запроса из NSDictionary - PullRequest
1 голос
/ 24 апреля 2019

Я хотел бы сгенерировать оператор SQL из моего объекта Dictionary. Потому что я должен исключить процесс обновления пустой строки в соответствующем столбце. я могу сделать это с помощью кода Swift, но повторять это действие не очень хорошо. Есть ли способ сделать это с помощью оператора SQL?.

Я нашел ссылку на StackOverflow. Asp.net ссылка

и ссылка MySQL StackOverflow

как пример в коде Python

def insertFromDict(table, dict):
    """Take dictionary object dict and produce sql for 
    inserting it into the named table"""
    sql = 'INSERT INTO ' + table
    sql += ' ('
    sql += ', '.join(dict)
    sql += ') VALUES ('
    sql += ', '.join(map(dictValuePad, dict))
    sql += ');'
    return sql

def dictValuePad(key):
    return '%(' + str(key) + ')s'

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Следующий метод сделает работу, но не предотвратит вас от инъекций sql

func insertStatement(table: String, dict: [String : Any]) -> String {
    let values: [String] = dict.values.compactMap { value in
        if value is String || value is Int || value is Double {
            return "'\(value)'"
        } else if let date = value as? Date {
            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "yyyy-MM-dd"
            return "'" + dateFormatter.string(from: date) + "'"
        }
        // handle other types if necessary

        return nil
    }

    return "INSERT INTO \(table) (" + dict.keys.joined(separator: ",") + ") VALUES (" + values.joined(separator: ",") + ")"
}

Использование: insertStatement(table: "test_table", dict: ["id": 8, "name" : "John", "age" : Date()])

Выход: INSERT INTO test_table(id,age,name) VALUES ('8','2019-04-24','John')

Для предотвращения SQL-инъекций вы должны использовать подготовленные операторы для привязки значений, например, в библиотеке PDO PHP, например:

func insertStatement(table: String, dict: [String : Any]) {
    let columns = dict.keys.joined(separator: ",")
    let values = dict.keys.map({ ":" + $0 }).joined(separator: ",")

    // build the statement
    let sql = "INSERT INTO " + table + "(" + columns + ") VALUES (" + values + ")"

    var bind: [String : Any] = [:]
    for (column, value) in dict {
        bind[":\(column)"] = value
    }
}
0 голосов
/ 24 апреля 2019
let r = sqlFrom(dict: ["name" : "String", "type" : "sort"], for: "MyTable")
print(r)

Необходимая функция:

func sqlFrom(dict : [String : String], for table : String) -> String {
    let keys = dict.keys.joined(separator: ", ")
    var values = dict.values.joined(separator: "', '")
    values = """
    '\(values)'
    """
    let sql = "INSERT INTO \(table) ( \(keys) ) VALUES ( \( values) );"
    return sql
}

Результат проверки здесь :

...