Как конвертировать longblob в читаемый формат - PullRequest
0 голосов
/ 07 мая 2019

Я использую ara для моего проекта, чтобы записать вывод playbook в базу данных (Mysql).Некоторые таблицы не читаются, я хотел бы знать, как преобразовать их, чтобы разработать страницу php для отображения этих значений:

вот мое описание таблицы:

mysql> desc data;
+-------------+--------------+------+-----+---------+-------+
| Field       | Type         | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| id          | varchar(36)  | NO   | PRI | NULL    |       |
| playbook_id | varchar(36)  | YES  | MUL | NULL    |       |
| key         | varchar(255) | YES  |     | NULL    |       |
| value       | longblob     | YES  |     | NULL    |       |
| type        | varchar(255) | YES  |     | NULL    |       |
+-------------+--------------+------+-----+---------+-------+

, как вы видитеЗначение столбца longblob, поэтому вывод не ясен:

mysql> select value from data;
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| value                                                                                                                                                                                                                                         |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| xœmŽË
ƒ0å"¸kMÄG;àÊU«@±5b &!7
ýû&R
¥Åp3Ì$§'fåc’Â!{©” ¸x™ÁQ¢Í"¦ÐíùB©`€‹ãš
                                           b%so­päjTëÌb÷j½9c<×ð_yÑ”»2øaó¢Ipíg;âOºd¬Û€~˜†xÆi~_À¡Ï¿[M“u¼`‘ó*´îáWòìI=N                                                                                                                                                     |
| xœmŽË
ƒ0å"¸³&â£f_påªU Ø1““R
¥Åp3Ì$Çæ0
˜ä}–Â!©” 8{™ÃA¢Í#¦Ð©`€«ãšŒb#Ë`­päbTçÌjwj»:c<×ð_EÙTY|ŸUÁË6µ_ì„?銱þôÃ4Äã0ÎËûŽCñÝjë˜lšà%‹\Ô¡u
                                                                                                  ¿’'ìÂ=O   

Я пытаюсь преобразовать эти данные в UTF-8, но это дает мне ноль:

SELECT CONVERT(value USING utf8) FROM data;
+---------------------------+
| CONVERT(value USING utf8) |
+---------------------------+
| NULL                      |
| NULL                      |
| NULL                      |
| NULL                      |
| NULL                      |
| NULL                      |
| NULL                      |
| NULL                      |
| NULL                      |
| NULL                      |
| NULL                      |
| NULL                      |
| NULL                      |
| NULL                      |
| NULL                      |
| NULL                      |
| NULL                      |
+---------------------------+
17 rows in set, 18 warnings (0,00 sec)

1 Ответ

0 голосов
/ 07 мая 2019

Я помогал в разработке некоторых из этих моделей :) (хотя я больше не являюсь активным разработчиком проекта).

Рассматривали ли вы просто использование веб-интерфейса Ara в качестве пользовательского интерфейса для этих данных? Как правило, это плохая идея - тыкать прямо в базу данных, как это, потому что она обычно не была разработана как стабильный API: есть отличный шанс, что какое-то будущее обновление нарушит ваш код, поскольку предполагается, что только ARA получает доступ к базе данных. .

В любом случае:

Для экономии места многие значения, хранящиеся в базе данных, сжимаются с использованием метода zlib.compress Python. Это обрабатывается типом CompressedData , который выглядит следующим образом:

class CompressedData(types.TypeDecorator):
    """
    Implements a new sqlalchemy column type that automatically serializes
    and compresses data when writing it to the database and decompresses
    the data when reading it.
    http://docs.sqlalchemy.org/en/latest/core/custom_types.html
    """
    impl = types.LargeBinary

    def process_bind_param(self, value, dialect):
        return zlib.compress(encodeutils.to_utf8(jsonutils.dumps(value)))

    def process_result_value(self, value, dialect):
        if value is not None:
            return jsonutils.loads(zlib.decompress(value))
        else:
            return value

    def copy(self, **kwargs):
        return CompressedData(self.impl.length)

Вам понадобится метод zlib.decompress или эквивалент php для чтения этих значений. Я не разработчик PHP, но похоже, что PHP как модуль zlib .

...