185 похожих чатов

Если кто-то еще будет искать PostgresNIO и PostgresDecodable, то оставлю

свой снипет.

import Foundation
import PostgresNIO

struct CountryRepository {
let client: PostgresClient

func get(id: UUID) async throws -> Country? {
let rows = try await client.query(Country.generateSelectQuery(id: id))

for try await row in rows {
return try Country(row: row.makeRandomAccess())
}

return nil
}
}

struct Country {
enum Fields {
enum V1 {
static var id = "id"
static var name = "name"
static var nameEs = "name_es"
}
}

let id: UUID
let name: String

var nameEs: String?

init(id: UUID = UUID(), name: String) {
self.id = id
self.name = name
}

init(row: PostgresRandomAccessRow) throws {
self.id = try row[Fields.V1.id].decode(UUID.self)
self.name = try row[Fields.V1.name].decode(String.self)

if row.contains(Fields.V1.nameEs) {
self.nameEs = try row[Fields.V1.nameEs].decode(String.self)
}
}
}

extension Country {
static var schema: String = "countries"

static func generateSelectQuery() -> PostgresQuery {
PostgresQuery(stringLiteral: "SELECT * FROM " + schema)
}

static func generateSelectQuery(id: UUID) -> PostgresQuery {
PostgresQuery(stringLiteral: "SELECT * FROM " + schema + " WHERE id = '\(id)'")
}
}

9 ответов

138 просмотров

Безопаснее будет вместо PostgresQuery(stringLiteral:) использовать PostgresQuery(stringInterpolation:)

Egor-Ledkov Автор вопроса
Тимур
Безопаснее будет вместо PostgresQuery(stringLitera...

Я вот думал об этом. В сущности боремся с SQL инъекциями.. Но существует ли такая опасность на сервере, внутри докера, в котором только приложение общается с базой, и никуда никаких портов не прокинуто? Ну кроме 80 к приложению понятно..

Egor Ledkov
Я вот думал об этом. В сущности боремся с SQL инъе...

Это вопрос из разряда "нужно ли включать поворотник на пустом перекрестке в 4ч утра?" Правильный ответ — не нужно вообще об этом думать, практика поступать так, как следует, должна быть закреплена на уровне рефлексов. :) Ну т.е. просто вообще никогда не нужно применять потенциально небезопасных решений и пытаться в каждом конкретном случае (кроме элементарных) выяснить спектр возможных угро и их вероятность в данном случае. Лишняя работа и ненулевая вероятность ошибочной оценки угроз. К тому же, рано или поздно наступит момент, когда ты просто скопипастишь код, подумав "я это уже делал же, у меня есть готовое решение" и забыв, что этот код писался для другого кейса.

Возвращаясь к вопросу — в коде одной из миграций у меня есть вот такое, это SQLKit: let initialId = String(LoadMigrationSeed_v2_0_0.ininialId) let rawSQL: SQLQueryString = "ALTER SEQUENCE \(raw: LoadAutoID.schema)_id_seq RESTART WITH \(raw: initialId);" return [ db.schema(LoadAutoID.schema) .field("id", .sql(raw: "SERIAL NOT NULL PRIMARY KEY")) .field(LoadAutoID.FieldKeys.updatedAt, .datetime, .required) .create(), (db as! SQLDatabase) .raw(rawSQL) .run() ].sequencedFlatMapEach(on: db.eventLoop) { $0 } (просто для информации)

Не уверен, что здесь точно происходит, но есть функции .all(decoding:) и .first(decoding:)

Egor-Ledkov Автор вопроса
Dmytro
Не уверен, что здесь точно происходит, но есть фун...

На картинке работа SQLKit (аналог PostgresKit). Как понимаю, это промежуточный уровень между PostgresNIO и Fluent.

Egor Ledkov
На картинке работа SQLKit (аналог PostgresKit). Ка...

PostgresNIO это сам клиент, а SQLKit универсальная обертка над всеми клиентами

Egor-Ledkov Автор вопроса
Dmytro
PostgresNIO это сам клиент, а SQLKit универсальная...

Да, все верно, а Fluent еще более универсальная и более обертка)

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта