Autor Téma: SQLite reštruktúrovať tabuľku - FireDAC  (Přečteno 703 krát)

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 374
  • Karma: 14
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
SQLite reštruktúrovať tabuľku - FireDAC
« kdy: 26-06-2018, 01:55:20 »
Alter table v SQLite toho veľa nedokáže.
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).
Podľa všetkého, SQLite engine to je jedno. Poriadok stráži FireDAC.
Dala by sa tabuľka reštruktúrovať len na úrovni FiredDAC, bez kopírovania údajov?
Niečo ako uvoľnenie reštrikcie.
Iná vec:
   SMALLINT, zmena na INT, resp. BIGINT.
Podľa všetkého Engina aj tak používa BigINT, lenže Firedac drží stráž a nepustí do SMALLINT už ani číslo 32768. Aj keď fyzické ukladanie je do priestoru BIGINT.
Zmena by mala byť vlastne len formalitou, nastavením nových mantinelov. Kontainer ako taký propblém nemá.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2232
  • Karma: 117
    • Verze Delphi: D2007, XE3, DX10
Re:SQLite reštruktúrovať tabuľku - FireDAC
« Odpověď #1 kdy: 26-06-2018, 08:24:15 »
Zmena by mala byť vlastne len formalitou, nastavením nových mantinelov. Kontainer ako taký propblém nemá.
Jestli si to za ta leta, co s tim nedelam, nezmenilo, tak SQLite si drzi DDL command v MASTER_TABLE. Odtamtud si to FireDAC precte a chova se podle toho, stejne jako se podle toho chova SQLite engine. Kdyz se podivas v SQLite consoli prikazem .schema <tablename>, tak bys mel videt uz ta omezeni.

A pak by teoreticky mohlo stacit vhodne zmenit ten SQL command v MASTER_TABLE se zachovanim mapovani na fyzicke typy SQLite.

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 374
  • Karma: 14
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite reštruktúrovať tabuľku - FireDAC
« Odpověď #2 kdy: 26-06-2018, 09:36:00 »
Zda sa to logicke a aj prakticky vykonatelne. Predpokladam vsak, ze praca s SQLite, ma vo FireDAC dve urovne.
Napriklad informaciu o nestandartnej interpretacii typu datum/cas.
Databaza SQLite v ramci CREATE TABLE tiez akceptuje napriklad SMALLINT,
ale fyzicky ho nepodporuje, interne ho zrejme nahradi BIGINT.
Preto si myslim, ze v tom ma prsty FireDAC.
Chcel by som menit aj tie nadstavbove vlastnosti, ak by sa dalo.
Zakladny namet beriem. Vyskusam. Dik

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1126
  • Karma: 52
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite reštruktúrovať tabuľku - FireDAC
« Odpověď #3 kdy: 26-06-2018, 12:14:08 »
Podľa všetkého, SQLite engine to je jedno. Poriadok stráži FireDAC.
Dala by sa tabuľka reštruktúrovať len na úrovni FiredDAC, bez kopírovania údajov?
Niečo ako uvoľnenie reštrikcie.

S pouzitim FireDAC pseudotypu by od nej nebylo pekne kdyby pripravil sloupec typu TLargeIntField pro datovy typ napr. SMALLINT. Takze ano, limit je na strane FireDAC.

Datove typy sloupcu si nechava FireDAC popisovat od SQLite engine po priprave prikazu ke spusteni (viz metoda TFDPhysSQLiteCommand.CreateColInfos a z ni volany getter TSQLiteValueDef.CreateForColumn jenz vola SQLite API funkci sqlite3_column_decltype). Pak si je mapuje na vlastni.

Oficialni moznosti jsou 2, mapovani a hinty datovych typu v SQL prikazu. Neoficialni by mohla byt uprava kodu zminovanych metod s tim ze pokud by se modifikovaly zdrojove datove typy, FireDAC by vytvoril odpovidajici mapovany sloupec a data by se do SQLite ulozila (samozrejme s prekrocenou hranici). Tedy alespon bych to cekal; nezkousel jsem.
« Poslední změna: 26-06-2018, 12:15:53 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 374
  • Karma: 14
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite reštruktúrovať tabuľku - FireDAC
« Odpověď #4 kdy: 26-06-2018, 14:03:58 »
Podľa všetkého, SQLite engine to je jedno. Poriadok stráži FireDAC.
Dala by sa tabuľka reštruktúrovať len na úrovni FiredDAC, bez kopírovania údajov?
Niečo ako uvoľnenie reštrikcie.
..
Datove typy sloupcu si nechava FireDAC popisovat od SQLite engine po priprave prikazu ke spusteni (viz metoda TFDPhysSQLiteCommand.CreateColInfos a z ni volany getter TSQLiteValueDef.CreateForColumn jenz vola SQLite API funkci sqlite3_column_decltype). Pak si je mapuje na vlastni.

Oficialni moznosti jsou 2, mapovani a hinty datovych typu v SQL prikazu. Neoficialni by mohla byt uprava kodu zminovanych metod s tim ze pokud by se modifikovaly zdrojove datove typy, FireDAC by vytvoril odpovidajici mapovany sloupec a data by se do SQLite ulozila (samozrejme s prekrocenou hranici). Tedy alespon bych to cekal; nezkousel jsem.
Toto sa mi páči, vyskúšam..

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1126
  • Karma: 52
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite reštruktúrovať tabuľku - FireDAC
« Odpověď #5 kdy: 26-06-2018, 14:16:49 »
Toto sa mi páči, vyskúšam..

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.
« Poslední změna: 26-06-2018, 14:18:49 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 374
  • Karma: 14
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite reštruktúrovať tabuľku - FireDAC
« Odpověď #6 kdy: 26-06-2018, 14:55:34 »
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
« Poslední změna: 26-06-2018, 14:59:28 od Miroslav Baláž »

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1126
  • Karma: 52
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite reštruktúrovať tabuľku - FireDAC
« Odpověď #7 kdy: 26-06-2018, 15:06:38 »
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

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).
« Poslední změna: 26-06-2018, 15:12:50 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline miroB

  • Hrdina
  • ****
  • Příspěvků: 374
  • Karma: 14
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite reštruktúrovať tabuľku - FireDAC
« Odpověď #8 kdy: 22-08-2018, 09:54:56 »
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á.
..
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 [Vybrat]
  1. create table BOOKS ( title TEXT( 4 ) NOT NULL, publication_date Date NOT NULL);
  2. insert into BOOKS VALUES ("NULLTEST",null);
  3. PRAGMA writable_schema = 1;
  4. UPDATE SQLITE_MASTER SET SQL = 'CREATE TABLE BOOKS ( title TEXT( 8 ) NOT NULL, publication_date DATE)' WHERE NAME = 'BOOKS';  
  5. 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.
« Poslední změna: 22-08-2018, 09:57:40 od miroB »

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: