Форум разработчиков

Ошбика при работе с базой PostgreSQL

 
Изображение пользователя Алексей Овчинников
Ошбика при работе с базой PostgreSQL
от Алексей Овчинников - Среда, 23 Декабрь 2015, 06:21
 

Доброго времени суток. Судя по данному сообщению, с данной БД код не тестируется.

Поскольку я пробую именно эту конфигурацию и обнаружил ошибку, привожу её здесь:

Ошибка проявляется при входе на страницу "Электронный деканат" (после успешной установки):

Debug info: ОШИБКА: ошибка синтаксиса (примерное положение: "`")
LINE 1: SELECT CONCAT(a.id, CONCAT('-', awa.id)) as `a.id-awa.id`, a...
^
SELECT CONCAT(a.id, CONCAT('-', awa.id)) as `a.id-awa.id`, a.*,awa.departmentid FROM mdl_block_dof_s_acl as a INNER JOIN mdl_block_dof_s_aclwarrantagents as awa ON awa.aclwarrantid = a.aclwarrantid WHERE awa.personid = '1' AND ( ( awa.begindate + awa.duration ) > '1450838880' OR awa.duration = '0' ) AND awa.status = 'active' GROUP BY a.id, awa.departmentid ORDER BY a.plugintype,a.plugincode
[array (
)]
Error code: dmlreadexception
Stack trace:
  • line 443 of /lib/dml_database.php: dml_read_exception thrown
  • line 244 of /lib/dml/pgsql_native_moodle_database.php: call to moodle_database->query_end()
  • line 764 of /lib/dml/pgsql_native_moodle_database.php: call to pgsql_native_moodle_database->query_end()
  • line 345 of /blocks/dof/lib/storage_base.php: call to pgsql_native_moodle_database->get_records_sql()
  • line 688 of /blocks/dof/storages/acl/init.php: call to dof_storage->get_records_sql()
  • line 727 of /blocks/dof/storages/departments/init.php: call to dof_storage_acl->get_right_person()
  • line 40 of /blocks/dof/im/standard/index.php: call to dof_storage_departments->get_right_dep()

При изучении кода выяснил причину. Файл /blocks/dof/storages/acl/init.php, строка 688:

$warrantscodessql = "SELECT CONCAT(a.id, CONCAT('-', awa.id)) as `a.id-awa.id`, a.*,awa.departmentid FROM " . $acl . " as a " .

Использование символов "`" (обратные кавычки) специфично для MySQL и не является стандартом SQL, как описано здесь:

MySQL uses ` (accent mark or backtick) to quote system identifiers, which is decidedly non-standard.

В PostgreSQL для этих целей используются двойные кавычки. Видимо, для обеспечения совместимости нужна дополнительная функция, "оборачивающая" строку в "правильные" кавычки в зависимости от используемой БД.

В любом случае, думаю, что было бы неплохо указать в руководстве по установке рекомендацию о том, что предпочтительно использование MySQL - по крайней мере, чтобы администраторы не выполняли лишнюю работу.

Спасибо и всем удачи!