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

Как можно пачкой сохранить оооочень много структур в бд? Пробовал

через фор ин, но нагрузка 80% и память сильно забивает

16 ответов

25 просмотров

bulk insert

Dmytro- Автор вопроса
Andrey Burov
bulk insert

Потребление с ним ещё больше, и вообще не похоже что он что что добавляет

Если во флуенте не батч, а последовательные инсерты, то будет быстрее конечно.

Dmytro- Автор вопроса
iMike
Если во флуенте не батч, а последовательные инсерт...

Не уверен что там батч или по одному. Метод у флюента есть для именно добавление массива, но не знаю как он работает А что по памяти? 400к структур. Думаю разбить в куски по 20к

Dmytro- Автор вопроса
iMike
screenshot

Можно в SwiftQL сделать ModelAuthenticatable?

Dmytro
Можно в SwiftQL сделать ModelAuthenticatable?

Давай сначала разберемся с либками 🙂 SwifQL это всего лишь либка которая делает SQL из выражений написанных на Swift, то есть она даже не умеет коннектиться к БД, она только выплевывает SQL-строку которую потом нужно выполнить через какой-либо БД-драйвер. postgres-nio это драйвер для БД который к ней коннектится и через него можно выполнять SQL выражения и получать резаультаты, но в чистом виде он довольно не легок в использовании, поэтому лучше иметь к нему обертку. Bridges это либка-обертка-помощник, которая дает возможность легко и красиво выполнять сгенерированные SwifQL SQL-запросы в любом БД-драйвере. Именно тут, например, и есть batchInsert метод. SwifQL и Bridges не привязаны к Vapor совсем, то есть их можно использовать с любыми фреймворками. Т.е. если завтра условно Vapor умрет и появится что-то еще, то можно будет код для БД не переписывать под новый фреймворк. Так вот, так как они не привязаны к Vapor как Fluent, то и ModelAuthenticatable из коробки нету, но ты можешь ее написать по образцу как это сделано для Fluent'овской Model https://github.com/vapor/fluent/blob/4004e926cdef1fbb937501c8a60554349cced675/Sources/Fluent/ModelAuthenticatable.swift и, кстати, если напишешь, то можешь законтрибьютить в https://github.com/SwifQL/VaporBridges который является мини-оберткой над Bridges и сделан специально для Vapor и соответственно в нем и должна/может жить ModelAuthenticatable, но т.к. лично я вапоровской авторизацией не пользуюсь, то я не делал 🙂

Dmytro- Автор вопроса
iMike
Давай сначала разберемся с либками 🙂 SwifQL это ...

Спасибо за объяснение. Тогда проще будет переписать код что сейчас и делать авторизаци вручную

import Vapor import Bridges public protocol ModelAuthenticatable: Table, Authenticatable { static var usernameKey: KeyPath<Self, Column<String>> { get } static var passwordHashKey: KeyPath<Self, Column<String>> { get } func verify(password: String) throws -> Bool } extension ModelAuthenticatable { public static func authenticator( database: DatabaseIdentifier ) -> Authenticator { ModelAuthenticator<Self>(database: database) } var _$username: Column<String> { self[keyPath: Self.usernameKey] } var _$passwordHash: Column<String> { self[keyPath: Self.passwordHashKey] } } private struct ModelAuthenticator<User>: BasicAuthenticator where User: ModelAuthenticatable { public let database: DatabaseIdentifier public func authenticate( basic: BasicAuthorization, for request: Request ) -> EventLoopFuture<Void> { User.query(on: database, on: request) .where(\User._$username == basic.username) .first() .flatMapThrowing { guard let user = $0 else { return } guard try user.verify(password: basic.password) else { return } request.auth.login(user) } } }

Dmytro- Автор вопроса
iMike
import Vapor import Bridges public protocol Model...

А оно не будет работать с вейпором, так как там import Fluent и уже ModelAuthenticatable оттуда используется

добавил это в VaporBridges, доступно с 1.0.0-rc.1.4.0

Dmytro- Автор вопроса

Можешь еще добавить SessionAuthenticatable и ModelCredentialsAuthenticator? Там тоже пару полей поменять

Dmytro- Автор вопроса
iMike
добавил это в VaporBridges, доступно с 1.0.0-rc.1....

Уже надоел, наверное, но есть ли метод для batch update?

Dmytro
Можешь еще добавить SessionAuthenticatable и Model...

ModelCredentialsAuthenticatable переписал, а `ModelCredentialsAuthenticator` сходу не удалось

Dmytro- Автор вопроса
iMike
Если во флуенте не батч, а последовательные инсерт...

Разделил на несколько частей по 999, на некоторых возникает ошибка query failed: read(descriptor:pointer:size:): Connection reset by peer (errno: 54) или query failed: NIOPostgres error: protocol error: Unexpected connection close Что нужно сделать?

Dmytro- Автор вопроса
Dmytro
Разделил на несколько частей по 999, на некоторых ...

Нашел, я на каждый чанк открывал новый connection

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
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
Карта сайта