Databáze > Ostatní DB

SQLite reštruktúrovať tabuľku - FireDAC

<< < (2/2)

100321:

--- Citace: Miroslav Baláž  26-06-2018, 14:03:58 ---Toto sa mi páči, vyskúšam..

--- Konce citace ---

Nicmene stale nechapu proc se vubec trapit pseudo datovymi typy jenz FireDAC nabizi. Nebude nakonec jednodussi pouzit jen storage tridy nabizene SQLite? Ze strany FireDAC jde o "bonus" k SQLite engine ktery se nakonec snazis obejit.

miroB:
Ten FireDAC "bonus" / pseudo datove typy, hodlam vyuzit.
Uz aj napriklad pre defaultnu sirku v dbGrid. Keby som pouzil Text( 1024 ), som za vodou, ale zobrazenie.. Nie je to vsak jediny dovod.

V priebehu casu sa moze stat, ze sa data vyvinu smerom k vyssim hodnotam. Typicky pole typu text, moze casom expandovat.
Preto existuje v inych databazach plnohodnotny "ALTER TABLE ALTER COLUMN"
Taky MS Access urcite nevyzaduje kopirovanie tabulky pri "upgrade" pola

100323:

--- Citace: Miroslav Baláž  26-06-2018, 14:55:34 ---Ten bonus hodlam vyuzit. V priebehu casu sa moze stat, ze sa data vyvinu smerom k vyssim hodnotam. Typicky pole typu text, moze casom expandovat.
Preto existuje v inych databazach plnohodnotny "ALTER TABLE ALTER COLUMN"
Taky MS Access urcite nevyzaduje kopirovanie tabulky pri "upgrade" pola

--- Konce citace ---

Ta kopie neni nic sloziteho. Abychom zustali u tematu. FireDAC momentalne nenabizi nativni zpusob modifikace schema databaze (ani SQLite nema jiny ALTER nez pomoci SQL). Muzes ty restrikce zkusit obejit upravou kodu nebo 2 oficialnimi zpusoby, nicmene porad jde o to ze mas urcitou definici tabulek jenz bych se osobne nesnazil ignorovat ale upravit (tedy tou uvedenou kopii).

miroB:

--- Citace: miroB  26-06-2018, 01:55:20 ---Alter table v SQLite .
Sú návody, ako reštruktúrovať tabuľku skopírovaním do novej.
Niečo ako "Lite" reštrukturalizácia, by nešla?
Napríklad :
     Text(30) na Text(100).
..
Zmena by mala byť vlastne len formalitou, nastavením nových mantinelov. Kontainer ako taký propblém nemá.
..

--- Konce citace ---
Našiel som "HARD" riešenie, cez zmenu obsahu v SQLITE_MASTER :

Zdroj:
https://stackoverflow.com/questions/805363/how-do-i-rename-a-column-in-a-sqlite-database-table/6684034#6684034

VAROVANIE:
Pozorne prečítať originál - odkaz. Je tam doporučené vopred urobiť zálohu.

Využitie:
Vyskúšal som. Funguje perfektne. Teda podľa očakávania. Treba spraviť znovuotvorenie Connection. To sa dá sa pochopiť.

Takto nejako som to skúšal, bolo treba dve zmeny v štruktúre tabuľky:
1. odobrať NOT NULL
2. Zvýšiť obsah textu:  Text( 4 ) na Text( 8 )

Príkazy použité v mojom texte:

--- Kód: MySQL ---DROP TABLE if exists BOOKS;create table BOOKS ( title TEXT( 4 ) NOT NULL, publication_date Date NOT NULL);insert into BOOKS VALUES ("NULLTEST",null);PRAGMA writable_schema = 1; UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT( 8 ) NOT NULL, publication_date DATE)' WHERE NAME = 'BOOKS';  PRAGMA writable_schema = 0;
Zmena prípustnej dĺžky textu, je vlastne iba kvôli FireDAC. Ten ju stráži. Db engine je to jedno. Preto si myslím, že toto riešenie nepredstavuje žiadne nebezpečie.
V uvedenom originály bol text aj tak definovaný bez dĺžky.
V Delphi preferujem realistickú dĺžku, najmä pre výpis v dbgrid-e a nakoniec aj kvôli kontrole.
Lenže pri importoch z CSV by mohol byť pri pridávaní do tabuľky problém.
Preto sú dobré tie zadné dvierka.

Navigace

[0] Seznam témat

[*] Předchozí strana

Přejít na plnou verzi