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)
}
Важно то, что это полезно только тогда, когда выполненные операторы не возвращают никакого результата. В противном случае вы не сможете использовать этот метод с несколькими операторами и вам придется обрабатывать их результаты отдельно.