Zjištění existence tabulek v DB

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Rellik
Člen | 104
+
0
-

Zdarvím vespolek,
dá se nějak jednoduše ověřit existence tabulek v DB a podle toho je buď automaticky vytvořit nebo pokračovat dál, pokud existují?
Vytvoření tabulek v DB mám udělané pomocí funkce

public function getInstall() {
        return $this->database->exec('//vytvoření tabulek');

kterou volám ve startup()v BasePresenteru. Tabulky se vytvoří správně, ale dál už to nejde, jelikož se to vytváření tabulek stále opakuje i když mají nastaveno „CREATE TABLE IF NOT EXISTS“ což sice znemožní opětovně tvořit tabulky, ale script se dál nehne.
Prostě bych potřebola tu funkci zavolat jen tehdy, pokud DB nebude obsahovat žádnou tabulku.
Díky za případnou odpověď. :)

Jan Mikeš
Člen | 771
+
0
-

Co takhle to resit pomoci SELECT * FROM tablename… kdyz tabulka neexistuje muzes zachytavat vyjimku :) pokud nevyhodi vyjimku – tabulka existuje

Vanamas
Člen | 20
+
0
-

SQL dotaz SHOW TABLES? Pokud vrátí count 0, tak tam žádná tabulka není.

Rellik
Člen | 104
+
0
-

Díky za odpovědi. Vytvoření tabulek podle jejich existence už funguje, bohužel stránky i tak vyhodí chybu, protože prý neexistují tabulky v DB přičemž se právě vytvořily a stránka byla přesměrována na další krok:

if ($this->model->isTables() == false) {
            $this->model->getInstall();
            $this->redirect('Install:');
        }

Chyba:

PDOException #42S02
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test_table.users' doesn't exist

Po dalším ručním refreši už to pak jede jak má.
Poradí ještě někdo i s tímto? Díky.

Editoval Rellik (30. 12. 2012 9:50)

enumag
Člen | 2118
+
0
-

Neotevíráš transakci dříve než pouštíš to vytváření tabulek? Mám pocit že změny struktury databáze se s transakcema moc nekamarádí, takže je vhodné transakci spouštět až potom.

Rellik
Člen | 104
+
0
-

To vytvoření tabulek je úplně první věc kterou by to mělo udělat. Je v BasePresenteru hned za definováním modelu:

BasePresenter:

public function startup() {
        parent::startup();

        $this->model = $this->getService('model');

        if ($this->model->isTables() == false) {
            $this->model->getInstall();
            $this->redirect('Install:');
        }
//...

Jak říkám, tabulky to vytvoří – kontroluju přímo v DB – přitom se vyhodí ta chyba (neexistující tabulky), která po další refreši zmizí a zobrazí se stránka, která se měla zobrazit.

enumag
Člen | 2118
+
0
-

V tom případě nevím… zkus se ještě podívat sem.

Rellik
Člen | 104
+
0
-

Tak podle toho článku by to chtělo asi refreš i připojení k DB aby se to znovu načetlo, jestli sem to teda dobře pochopil. To teda nevím, jak provést :)

enumag
Člen | 2118
+
0
-

To je zase jedna z těch věcí, která by se jednoduše vyřešila kdyby Connection používalo PDO jako kompozici a ne pomocí dědičnosti. Pak by totiž bylo jednoduché, napsat metodu která by zahodila původní PDO a vytvořila nové, čímž by se připojení k databázi obnovilo. Bohužel tuhle věc už nějakou dobu blokuje @dg aniž by uvedl jakýkoli důvod.

Rellik
Člen | 104
+
0
-

Tak sem to vyřešil trošku prasáckým způsobem: Po vytvoření tabulek, se to přesměruje na samostatný soubor, kde je výpis o úspěšné instalaci a odkaz na dokončení instalace vytvořením hlavního administrátora. Tím pádem se obnoví i připojení k DB a tak se už dál provádí vše jak by mělo.
Takže díky za rady a kdyby někoho napadlo elegantnější řešení, tak písnětě. :)