PostgreSQLClientKit запрашивает базу данных

Есть ли короткий способ подготовить операторы и выполнить их, если вы пытаетесь выполнить несколько запросов и вас не интересуют результаты, генерируемые этими операторами.

Например, я хочу выполнить эти два оператора, есть ли короткий способ написать эти два оператора и выполнить их.

      do{
        let load_age_statement = try connection.prepareStatement(text: "Load 'age';")
        let set_path_statement = try connection.prepareStatement(text: "SET search_path = ag_catalog, '$user', public;")
    
        var cursor = try load_age_statement.execute()
        load_age_statement.close()
        cursor  = try set_path_statement.execute()
        
}catch{
        print(error)
}

4 ответа

Если цель состоит в том, чтобы сократить код, можно уменьшить количество строк, объединив операторы в цепочку и удалив ненужные переменные, такие как курсор. Вот пример того, как можно сократить код:

      do {
try connection.prepareStatement(text: "Load 'age';")
    .execute()
    .close()
try connection.prepareStatement(text: "SET search_path = ag_catalog, '$user', public;")
    .execute()
} catch {
    print(error)
}

Я только что погуглил и нашел более изысканный ответ, который будет вам полезен.

Вы можете выполнить оператор SQL непосредственно на объекте соединения с помощью команды execute the, но этот метод более рекомендуется использовать из соображений безопасности, поскольку он предотвращает атаки SQL-инъекций.

В этом случае код мог бы быть

      do {
try connection.execute(text: "Load 'age';")
try connection.execute(text: "SET search_path = ag_catalog, '$user', public;")
} catch {
print(error)
}

Однако важно отметить, что этот метод менее безопасен и более подвержен атакам с внедрением SQL. Рекомендуется использовать метод «prepareStatement» для предотвращения атак SQL-инъекций.

Вы можете попробовать создать служебную функцию для реализации нескольких запросов. Попробуйте приведенный ниже пример, который принимает список запросов.

      import Foundation

func executeMultipleStatements(connection: Connection, queries: [String]) {
    for query in queries {
        do {
            let statement = try connection.prepareStatement(text: query)
            let _ = try statement.execute()
            statement.close()
        } catch {
            print("Error executing query '\(query)': \(error)")
        }
    }
}

do {
    let connection = try Connection()
    let queries = [
        "LOAD 'age';",
        "SET search_path = ag_catalog, '$user', public;"
    ]
    executeMultipleStatements(connection: connection, queries: queries)
} catch {
    print("Error: \(error)")
}

В PostgresqlClientKit вы можете выполнить несколько операторов в одном запросе. Вот пример:

      do {
    let multiStatement = """
                            LOAD 'age';
                            SET search_path = ag_catalog, '$user', public;
                            """
    try connection.query(multiStatement)
} catch {
    print(error)
}

Важно то, что это полезно только тогда, когда выполненные операторы не возвращают никакого результата. В противном случае вы не сможете использовать этот метод с несколькими операторами и вам придется обрабатывать их результаты отдельно.

Другие вопросы по тегам