сохранение UUID в MariaDB для использования с Vapor - PullRequest
1 голос
/ 05 января 2020

Я хочу использовать Fluent MySQL в Vapor для сохранения данных, но я не могу правильно прочитать UUID.

Если я использую функцию UUID (), предоставляемую MariaDB, все в порядке, но если я использую Fluent MySQL, UUID зашифрован: (первая запись: использование UUID (), вторая запись: Vapor)

MariaDB [someDB]> select * from Poll;
+--------------------------------------+-------+---------+---------+--------+--------+
| id                                   | title | option1 | option2 | votes1 | votes2 |
+--------------------------------------+-------+---------+---------+--------+--------+
| 88a18a58-2fcd-11ea-9f62-e283e8014c79 | test  | bla     | bla     |      0 |      0 |
| 7??/.?E??*_P?v                     | bla   | option1 | option2 |      1 |      2 |
+--------------------------------------+-------+---------+---------+--------+--------+
2 rows in set (0.00 sec)

Это моя модель:

import Foundation
import FluentMySQL
import Vapor

struct Poll: Content, MySQLUUIDModel, Migration {
    typealias ID = UUID
    static let entity: String = "Poll"

    var id: UUID?
    var title: String
    var option1: String
    var option2: String
    var votes1: Int
    var votes2: Int
}

это моя table:

MariaDB [someDB]> describe Poll;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id      | varchar(191) | YES  |     | NULL    |       |
| title   | varchar(191) | YES  |     | NULL    |       |
| option1 | varchar(191) | YES  |     | NULL    |       |
| option2 | varchar(191) | YES  |     | NULL    |       |
| votes1  | int(10)      | YES  |     | NULL    |       |
| votes2  | int(10)      | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

Но если использовать Vapor для извлечения данных, все будет в порядке. Что я делаю не так?

Вывод через curl:

curl http://locurl http://localhost:8080/polls/list
[{"option1":"bla","id":"38386131-3861-3538-2D32-6663642D3131","title":"test","option2":"bla","votes1":0,"votes2":0},{"option1":"option1","id":"373F3F2F-2E3F-453F-3F0E-2A5F503F7607","title":"bla","option2":"option2","votes1":1,"votes2":2}]

Спасибо за помощь заранее.

1 Ответ

1 голос
/ 05 января 2020

Если вы используете Vapor для создания самого поля UUID, оно создает поле с типом данных varbinary(16), а не varchar(191). Это согласуется с форматом по умолчанию для поля UUID в MariaDB / MySQL.

Я предполагаю, что это устаревшее приложение с данными, создаваемыми вне Vapor? Похоже, вы храните строковое представление значения UUID, а не базовое двоичное значение. Хранение двоичных значений в поле varchar вызывает проблемы (как вы обнаружили), только если вы предполагаете, что все значения можно распечатать. Однако сочетание значений строки и двоичного формата в одном столбце может вызвать проблемы.

...