через фор ин, но нагрузка 80% и память сильно забивает
bulk insert
Потребление с ним ещё больше, и вообще не похоже что он что что добавляет
Если во флуенте не батч, а последовательные инсерты, то будет быстрее конечно.
Не уверен что там батч или по одному. Метод у флюента есть для именно добавление массива, но не знаю как он работает А что по памяти? 400к структур. Думаю разбить в куски по 20к
Давай сначала разберемся с либками 🙂 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, но т.к. лично я вапоровской авторизацией не пользуюсь, то я не делал 🙂
Спасибо за объяснение. Тогда проще будет переписать код что сейчас и делать авторизаци вручную
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) } } }
А оно не будет работать с вейпором, так как там import Fluent и уже ModelAuthenticatable оттуда используется
добавил это в VaporBridges, доступно с 1.0.0-rc.1.4.0
Можешь еще добавить SessionAuthenticatable и ModelCredentialsAuthenticator? Там тоже пару полей поменять
Уже надоел, наверное, но есть ли метод для batch update?
ModelCredentialsAuthenticatable переписал, а `ModelCredentialsAuthenticator` сходу не удалось
Разделил на несколько частей по 999, на некоторых возникает ошибка query failed: read(descriptor:pointer:size:): Connection reset by peer (errno: 54) или query failed: NIOPostgres error: protocol error: Unexpected connection close Что нужно сделать?
Нашел, я на каждый чанк открывал новый connection
Обсуждают сегодня