В соответствии с PHP документами метод existsInDatabase()
предназначен для определения, существует ли экземпляр Collection в базе данных (как SchemaObject aka a Table) . Но он считает, что Коллекция существует, только если схема ее таблицы точно соответствует той, какой она была бы, если бы она была создана с использованием метода Schema::createCollection()
, например. Ровно 2 столбца, которые называются doc
и _id
.
Это ошибка, вызванная слишком строгим модулем PHP?
Вот демонстрация (Зависит от mysql_xdevapi PHP модуль ) ...
Во-первых, используйте MySQL для создания коллекции под названием 'people' в вашей базе данных (как взято из сценария MySQL world_x. sql в примерах для JavaScript / Python):
CREATE TABLE `countryinfo` (
`doc` json DEFAULT NULL,
`_id` varbinary(32) GENERATED ALWAYS AS (json_unquote(json_extract(`doc`,_utf8mb4'$._id'))) STORED NOT NULL,
`_json_schema` json GENERATED ALWAYS AS (_utf8mb4'{"type":"object"}') VIRTUAL,
PRIMARY KEY (`_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Во-вторых, создайте коллекцию под названием 'people', очень похожую на приведенную выше, но с опущенным столбцом _json_schema
:
CREATE TABLE `people` (
`doc` json DEFAULT NULL,
`_id` varbinary(32) GENERATED ALWAYS AS (json_unquote(json_extract(`doc`,_utf8mb4'$._id'))) STORED NOT NULL,
PRIMARY KEY (`_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
В-третьих , используйте метод PHP createCollection()
, чтобы создать коллекцию с именем «животных»:
$dbSession = mysql_xdevapi\getSession("mysqlx://test:test@localhost");
$schema = $dbSession->getSchema("world_x");
$collection = $schema->createCollection('animals');
Теперь используйте метод PHP 'existsInDatabase()
, чтобы проверить 3 коллекции:
$dbSession = mysql_xdevapi\getSession("mysqlx://test:test@localhost");
$schema = $dbSession->getSchema("world_x");
if ($schema->getCollection('countryinfo')->existsInDatabase()) {
print "countryinfo collection exist! ";
}
if ($schema->getCollection('people')->existsInDatabase()) {
print "People collection exist! ";
}
if ($schema->getCollection('animals')->existsInDatabase()) {
print "Animals collection exist! ";
}
Все 3 из них являются действительными коллекциями согласно MySQL документам, но вышеприведенный код PHP распознает только "людей" и "животных" как существующих.
В качестве дальнейшего эксперимента используйте MySQL, чтобы добавить любой произвольно названный столбец в коллекцию с именем "animals" (которая была создана с помощью PHP) и повторно выполнить сценарий для посмотрим, как оно сейчас не считает его существующим.
ALTER TABLE animals ADD COLUMN test tinyint;
Теперь, если вы используете $schema->getCollections()
и $schema->getTables()
, вы увидите, что animals
классифицируется по таблицам, а не по коллекциям. Оставьте этот столбец, и он снова отскочит. Под bo nnet именно так модуль решает, существует ли коллекция.
Я подозреваю, что модуль PHP может быть слишком строгим. Это проблема, потому что она тесно связывает вашу схему базы данных с указанным c языком. Если, например, я хотел создать сценарий PHP для взаимодействия с существующим MySQL хранилищем документов, которое изначально заполнялось через JavaScript, это могло бы привести к ошибкам, поскольку предположительно этот дополнительный столбец _json_schema
(или некоторые другие столбцы) будет существовать в некоторых / всех коллекциях.
Я предполагаю, что допустимо иметь столбцы, отличные от doc
и _id
, так как я не нашел спецификаций наоборот. Я могу представить очень реальный вариант использования столбца created_at
datetime в коллекции.
Или я обнаружил проблему не с модулем PHP, а с документацией MySQL? Является ли столбец _json_schema
похмелью от ранней версии, которую теперь следует удалить? Является ли определение таблицы Collection теперь стандартизированным по всем языкам, и они должны строго содержать только эти 2 столбца, как указано?
Все немного пушисто, когда MySQL неопределенно, но PHP строго.
Любая помощь приветствуется. Я сообщу об ошибках сопровождающим, если все согласны с тем, что есть ошибка.