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 ответов

134 просмотра

Безопаснее будет вместо 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 еще более универсальная и более обертка)

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Ребят в СИ можно реализовать ООП?
Николай
33
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Карта сайта