Database: Insert do tabulky bez PK

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

Ahoj,
mám problém při insertu do databáze. Navrhnu jsem jednoduchou tabulku pro logování akcí, která obsahuje

  • time datum a čas události,
  • ip IP adresu,
  • user_id ID uživatele
  • action akci, kterou loguji.

Tabulka neobsahuje žádné klíče ani indexy, protože pro logování nejsou potřeba.

Při insertu, který vypadá jednoduše takto:

$this->context->table('log')->insert($data);

mi Nette vyhodí chybu
SQLSTATE[42S22]: Column not found: 1054 Unknown column ‚log.id‘ in ‚where clause‘

při dotazu SELECT * FROM log WHERE (log.id = ‚0‘)

Insert se nicméně povede, v databázi data jsou.

Už jsem si našel, že Nette selektuje po insertu daný řádek, aby jej mohl vrátit a že asi před rokem se podobný problém řešil, ale měl by být vyřešen. viz https://github.com/…/issues/1069

Používám nette 2.2.2

petr.pavel
Člen | 535
+
0
-

Z toho fixu, na který odkazuješ, vyplývá, že $this->primary musí být null a to se tam dostane přes reflexi. Tipl bych si, že používáš ConventionalReflection, která pro každou tabulku předpokládá primární klíč id. Takže buď používej DiscoveredReflection nebo si definuj vlastní konvenční, kde uděláš výjimku v getPrimary().

vaca
Člen | 2
+
0
-

Dík, to by dávalo smysl. Snažím se to nastavit přes config.neon a stále beze změny, dle návodu by mělo stačit

nette:
    database:
        reflection: discovered

nebo

nette:
    database:
        reflection: Nette\Database\Reflection\DiscoveredReflection

Dělám něco špatně? Jak poznám, kterou reflexi používám? Příklad nastavení při připojení, který jsem našel, je také očividně zastaralý (třída DiscoveredReflection požaduje v konstruktoru connection)

$connection->setDatabaseReflection(new \Nette\Database\Reflection\DiscoveredReflection());
petr.pavel
Člen | 535
+
0
-

S NDB moc nedělám, takže s konfigurací ti nepomůžu. Mrkni do „zkompilovaného“ configurátoru v tmp/cache_Nette.Configurator – metoda createServiceNette__database__default(). Tam poznáš, jaká reflexe se používá.