Слишком большой объект Silverstripe DataObject для сохранения с использованием MySQL / InnoDB - PullRequest
0 голосов
/ 09 января 2019

вопрос о веб-приложении, использующем PHP7.1, Silverstripe 3.6.0 и MySQL. Приложение размещено на провайдере PaaS. Поэтому у меня нет прямого доступа к базе данных и я не могу настроить InnoDB, как предлагает сообщение об ошибке.

У меня есть пользовательский DataObject с множеством полей. При попытке сохранить возвращается странная ошибка:

Не удалось выполнить запрос: [... большой запрос на обновление здесь ...] Слишком большой размер строки (> 8126). Может помочь изменение некоторых столбцов на TEXT или BLOB или использование ROW_FORMAT = DYNAMIC или ROW_FORMAT = COMPRESSED. В текущем формате строки префикс BLOB размером 768 байт хранится в строке.

Здесь вы найдете сокращенную версию моего класса:

class APIPersonResource extends DataObject {
  private static $db = array(
    'ResourceID' => 'Int',
    'Firstname' => 'Varchar(255)',
    'Lastname' => 'Varchar(255)',
    'Salutation' => 'Varchar(255)',
    'Email' => 'Varchar(255)',
    'HomepageLink' => 'Text',
    'PhoneNo' => 'Varchar(255)',
    'Info' => 'HTMLText',
    'IsResponsible' => 'Boolean',
    'ResponsibleDescription' => 'Varchar(255)',
    'ShortBio' => 'HTMLText',
    'RoomNo' => 'Varchar',
    'IsActive' => 'Boolean',
    'IsAcademic' => 'Boolean',
    'HasImage' => 'Boolean',
    'HasLinksSection' => 'Boolean',
    'HasCv' => 'Boolean',
    'HasPublications' => 'Boolean',
    'HasOfficeHours' => 'Boolean',
    'AreaOfFocus' => 'Varchar(64)',
    'OleLink' => 'Text',
    'ReserveCollectionLink' => 'Text',
    'ResearchAreas' => 'HTMLText',
    'APIDepartmentResourceID' => 'Int',
    'APIAddressResourceID' => 'Int',
    'APIDegreeResourceID' => 'Int'
  );
}

ShortBio, AreaOfFocus, ResearchAreas и Info - все поля пользовательского ввода, которые могут стать очень длинными. Странно то, что эти поля имеют тип HTMLText, а в таблице базы данных столбцы имеют тип mediumtext:

MariaDB [leonixyz]> describe APIPersonResource;
+------------------------------+---------------------------------------------------+------+-----+-------------------+----------------+
| Field                        | Type                                              | Null | Key | Default           | Extra          |
+------------------------------+---------------------------------------------------+------+-----+-------------------+----------------+
| ID                           | int(11)                                           | NO   | PRI | NULL              | auto_increment |
| ClassName                    | enum('APIPersonResource','APIPhdStudentResource') | YES  | MUL | APIPersonResource |                |
| LastEdited                   | datetime                                          | YES  |     | NULL              |                |
| Created                      | datetime                                          | YES  |     | NULL              |                |
| Salutation_en_US             | varchar(255)                                      | YES  |     | NULL              |                |
| Salutation_de_DE             | varchar(255)                                      | YES  |     | NULL              |                |
| Salutation_it_IT             | varchar(255)                                      | YES  |     | NULL              |                |
| ResponsibleDescription_en_US | varchar(255)                                      | YES  |     | NULL              |                |
| ResponsibleDescription_de_DE | varchar(255)                                      | YES  |     | NULL              |                |
| ResponsibleDescription_it_IT | varchar(255)                                      | YES  |     | NULL              |                |
| ShortBio_en_US               | mediumtext                                        | YES  |     | NULL              |                |
| ShortBio_de_DE               | mediumtext                                        | YES  |     | NULL              |                |
| ShortBio_it_IT               | mediumtext                                        | YES  |     | NULL              |                |
| ResourceID                   | int(11)                                           | NO   |     | 0                 |                |
| Firstname                    | varchar(255)                                      | YES  |     | NULL              |                |
| Lastname                     | varchar(255)                                      | YES  |     | NULL              |                |
| Salutation                   | varchar(255)                                      | YES  |     | NULL              |                |
| Email                        | varchar(255)                                      | YES  |     | NULL              |                |
| PhoneNo                      | varchar(255)                                      | YES  |     | NULL              |                |
| IsResponsible                | tinyint(1) unsigned                               | NO   |     | 0                 |                |
| ResponsibleDescription       | varchar(255)                                      | YES  |     | NULL              |                |
| ShortBio                     | mediumtext                                        | YES  |     | NULL              |                |
| IsActive                     | tinyint(1) unsigned                               | NO   |     | 0                 |                |
| HasActiveContract            | tinyint(1) unsigned                               | NO   |     | 0                 |                |
| APIDepartmentResourceID      | int(11)                                           | NO   |     | 0                 |                |
| RoomNo                       | varchar(50)                                       | YES  |     | NULL              |                |
| HasImage                     | tinyint(1) unsigned                               | NO   |     | 0                 |                |
| HasCv                        | tinyint(1) unsigned                               | NO   |     | 0                 |                |
| HasPublications              | tinyint(1) unsigned                               | NO   |     | 0                 |                |
| APIAddressResourceID         | int(11)                                           | NO   |     | 0                 |                |
| AreaOfFocus_en_US            | varchar(64)                                       | YES  |     | NULL              |                |
| AreaOfFocus_de_DE            | varchar(64)                                       | YES  |     | NULL              |                |
| AreaOfFocus_it_IT            | varchar(64)                                       | YES  |     | NULL              |                |
| AreaOfFocus                  | varchar(64)                                       | YES  |     | NULL              |                |
| HomepageLink                 | mediumtext                                        | YES  |     | NULL              |                |
| Info_en_US                   | mediumtext                                        | YES  |     | NULL              |                |
| Info_de_DE                   | mediumtext                                        | YES  |     | NULL              |                |
| Info_it_IT                   | mediumtext                                        | YES  |     | NULL              |                |
| ResearchAreas_en_US          | mediumtext                                        | YES  |     | NULL              |                |
| ResearchAreas_de_DE          | mediumtext                                        | YES  |     | NULL              |                |
| ResearchAreas_it_IT          | mediumtext                                        | YES  |     | NULL              |                |
| Info                         | mediumtext                                        | YES  |     | NULL              |                |
| HasLinksSection              | tinyint(1) unsigned                               | NO   |     | 0                 |                |
| HasOfficeHours               | tinyint(1) unsigned                               | NO   |     | 0                 |                |
| OleLink                      | mediumtext                                        | YES  |     | NULL              |                |
| ReserveCollectionLink        | mediumtext                                        | YES  |     | NULL              |                |
| ResearchAreas                | mediumtext                                        | YES  |     | NULL              |                |
| APIDegreeResourceID          | int(11)                                           | NO   |     | 0                 |                |
| IsAcademic                   | tinyint(1) unsigned                               | NO   |     | 0                 |                |
+------------------------------+---------------------------------------------------+------+-----+-------------------+----------------+

Есть ли способ решить эту проблему, не разбивая мой объект на части?

Заранее спасибо

1 Ответ

0 голосов
/ 09 января 2019

Вы должны либо выполнить рефакторинг вашей модели (например, используя отношения 1: 1 с has_one и belongs_to), либо установить RowFormat в сжатое состояние. Это можно сделать для каждого объекта DataObject с помощью этого кода (из SS3, но также должен работать и для SS4):

private static $create_table_options = array(
    'MySQLDatabase' => 'ENGINE=InnoDB ROW_FORMAT=COMPRESSED'
);
...