Kiedy mogę używać wielu baz danych w Drupal 7, jak mogę określić, że tabela ma być tworzona w innej bazie danych na innym serwerze?
Domyślnie podczas instalowania modułu Drupal zakłada, że wszystko w hook_schema()
powinno być zainstalowane w domyślnej bazie danych. Czy istnieje sposób, aby określić, że tabela powinna zostać utworzona w innej bazie danych, czy istnieje jakiś sposób ręcznego obejścia, którego mogę użyć?
Odpowiedzi:
Nie sądzę, że istnieje oficjalny interfejs API; ogólnie nie ma sensu robić tego.
To powiedziawszy, wszystko co musisz zrobić, to nadać swoją
hook_schema
inną nazwę niżyourmodule_schema
(w zasadzie cokolwiek chcesz, jakyourmodule_schema_otherdb
), a następnie w hook_install (), najpierw przełącz bazę danych , a następnie zreplikuj to, co robi drupal_install_schema () , z wyjątkiem tego, że wywołujesz niestandardową definicję schematu funkcji, a następnie przełącz bazę danych z powrotem na domyślną.Pamiętaj też o wdrożeniu
hook_uninstall()
.Nie mam jednak pojęcia, dlaczego chcesz to zrobić. :)
źródło
CREATE TABLE
stwierdzeń.Osiągnąłem to dzięki informacjom dostarczonym przez Berdir . Mój kod wygląda następująco:
źródło
Wersja Drupala 8 kodu pliku * .install dostarczonego przez @ Елин Й .:
Uwaga: Baza danych musi istnieć i zostać określona w pliku settings.php.
Oto sedno .
źródło
W Settings.php
$db_url=array('default'=>$db_url, 'sec_db'=>$sec_db_url);
In
hook_schema
db_set_active('sec_db')
połączy się teraz z innym DB, nie jestem pewien, czy jest to zalecane, czy też nie wypróbuj go na własne ryzyko. I można użyć przedrostka db_prefix do zapytania z tego dodatkowego DB. Możesz użyć przedrostka db w pliku settings.phpźródło
$db_url
,$db_prefix
jako ustawienie globalne są dla Drupal 6. I kropka-notacja działa tylko w przypadku korzystania z innej bazy danych na tym samym serwerze MySQL, a nie kiedy (jak w moim przypadku) masz dostęp do różnych serwerów.$db_url
globalnej$db_prefix
, a nawet gdyby tak było, nie rozwiązałoby to problemu.