Database: Insert do tabulky bez PK
- vaca
- Člen | 2
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živateleaction
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
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
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
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á.