Jak poprawnie zaimplementować pole data mysql lub data / godzina w hook_schema ()?


13

Napisałem plik mymodule.install, który zawiera definicję schematu do utworzenia tabeli w mojej bazie danych. Ta tabela zawiera dwa pola danych. Te pola zostaną wypełnione przez użytkowników, gdy wypełnią określoną treść (na przykład: aby podać datę publikacji wiadomości). Teraz nie użyłem celowo modułu Data, ponieważ potrzebowałem, aby te dwa pola znajdowały się w tym samym wierszu w tabeli bazy danych z innych powodów.

Schemat hook_schema definiuje dwa pola w następujący sposób:

'pubblish_date' => array(
    'description' => t('The pubblish date for the single news'),
    'mysql_type' => 'datetime',
    'not null' => FALSE,
  ),
  'unpublish_date' => array(
    'description' => t('The unpublish date for the single news'),
    'mysql_type' => 'datetime',
    'not null' => FALSE,
  ),

Tabela jest poprawnie utworzona w bazie danych, ale zawsze otrzymuję te wiadomości z poradami:

Pole news_board.pubblish_date: brak typu schematu dla datetime typu mysql. Pole news_board.unpublish_date: brak typu schematu dla datetime typu mysql. news_board.pubblish_date: brak typu dla typu schematu: normal. Pole news_board.pubblish_date: brak typu schematu dla typu. news_board.unpublish_date: brak typu dla typu schematu: normal. Pole news_board.unpublish_date: brak typu schematu dla typu.

Wydaje mi się to dziwne, ponieważ ja w dokumentacji korzystam ze specyfikacji mysql_type w celu przechowywania formatu datetime w bazie danych mysql.

Wiem, że Drupal obsługuje natywnie znaczniki czasu i jeśli chcesz przechowywać inny format daty, musisz użyć określonych definicji, takich jak typ mysql lub typ pgsql, zgodnie z bazą danych, z której korzystasz.

Podczas dyskusji znalazłem w Internecie, że wielu ludzi używało definicji mysql_type i z tego, co widziałem, rozwiązali problem, więc dlaczego to nie działa dla mnie?

Wielkie dzięki.

Odpowiedzi:


12

Należy podać typ rezerwowy ( varchar) w przypadku, gdy baza danych nie jest mysql.

'pubblish_date' => array(
  'description' => t('The pubblish date for the single news'),
  'type' => 'varchar',
  'mysql_type' => 'datetime',
  'not null' => FALSE,
),
'unpublish_date' => array(
  'description' => t('The unpublish date for the single news'),
  'type' => 'varchar',
  'mysql_type' => 'datetime',
  'not null' => FALSE,
),

Jednak wiadomości, które widzisz, pochodzą z modułu Schema . Ten problem jest już zarejestrowany jako problem # 468644 .

Implementacja mysql datetime w twoim schemacie jest w porządku. Możesz bezpiecznie zignorować te wiadomości. Powiedziałbym, że te „wiadomości z poradami” są spowodowane błędem w module Schema.


Cześć Gisle, dziękuję za odpowiedź. Właśnie zrobiłem modyfikację, którą zasugerowałeś i tak, tworzy tabelę w bazie danych, ale nadal mam te porady: •Field news_board.pubblish_date: no Schema type for mysql type datetime. •Field news_board.unpublish_date: no Schema type for mysql type datetime.
Marco

Tak, wiem, wyłączyłem i odinstalowałem, ale wynik jest taki sam. Podstawową wersją, której używam, jest 7.22. Chcę określić, że mam również zainstalowany moduł schematu. Wspomniane porady pojawiają się, gdy próbuję sprawdzić schemat bazy danych za pomocą tego modułu. Szczerze mówiąc, nie próbowałem sprawdzać, czy pojawiają się one również w innej części interfejsu administratora. Zastanawiam się również, czy mogę zignorować te komunikaty w tym momencie i kontynuować budowanie modułu. Nie wiem, czy wpłynie to na funkcjonalność samego modułu.
Marco

OK, dziękuję bardzo za poświęcony mi czas Gisle, uratowałeś dużo mojego!
Marco

0

Jeśli chcesz użyć typu rekordu nieuwzględnionego na oficjalnie obsługiwanej liście typów, możesz określić typ dla każdego zaplecza bazy danych.

W takim przypadku możesz pominąć parametr type, ale pamiętaj, że Twój schemat nie załaduje się dla backendów, które nie mają określonego typu. Możliwym rozwiązaniem może być użycie typu „tekst” jako rezerwowego. ( https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Database%21database.api.php/group/schemaapi/8.2.x )

'submit_date' => array( 'type' => 'varchar', 'mysql_type' => 'datet', )

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.