rtgx

Import dát (nielen v Typo3)

Všeobecný úvod

Na import alebo konverziu databáz rôzne existujú nástroje, špeciálne pre Typo3 napríklad External Import Tutorial, ktorý je manuálom k použitiu týchto modulov. To, čo chcem opísať je iná cesta, ktorá sa hodí pre menšie projekty - vytvorenie súboru SQL príkazov, ktoré spravia potrebé konverzie a presuny medzi tabuľkami jednej databázy.

Zložitosť importu dát závisí hlavne od komplikovanosti relácií medzi tabuľkami, medzi ktorými budeme dáta prenášať. Ide hlavne o to - podrobne poznať štruktúru tabuliek, ktoré budeme spracovávať, pričom je nevyhnutná znalosť jazyka SQL.

Základné pravidlá

  1. tabuľky starého aj nového systému máme v jednej databáze; napr. starú DB naimportujeme do novej cez phpMyAdmin (pozor na rovnaké názvy tabuliek v starom a novom systéme!)
  2. typ jednotlivých stĺpcov tabuliek; napr. pri importe typu TEXT do VARCHAR(40) musíme počítať s tým, že sa do novej tabuľky nakopíruje len obmedzený počet znakov, alebo zmeníme typ stĺpca novej tabuľky tak, aby neobmedzil veľkosť imporovanej položky
  3. konverzie stĺpcov; napr. pôvodný dátum je uložený vo formáte '2003-12-31 01:02:03' ale my potrebujeme časový úudaj v unix formáte (integer), čiže musíme použiť príslušnú SLQ funkciu na konverziu
  4. relačné vzťahy; ešte pred samotným importom je potrebné určiť, ktoré relácie musia fungovať v novom systéme a nezaťažovať sa vzťahmi, ktoré v novom systéme nepotrebujeme
  5. kopírovanie súborov uložených mimo databázu; napr. stĺpec tabuľky obsahuje názov súboru 'tabulka.xls', musíme zistiť, kde s v pôvodnom systéme tento súbor nachádza, a nakopírovať ho do správneho adresára v novom systéme
  6. kontrola naimportovaných údajov; samotný obsah položiek a hlavne funkčnosť relačných vzťahov
  7. dodatočné úpravy; napr. nová tabuľka obsahuje stĺpec, ktorý sme neimportovali, ale chceme aby obsahoval nejakú hodnotu, a pri importe sme to vynechali, tak dodatočne spravíme update importovaných záznamov

Príklad 1

Presun DB dát a súborov z jedného modulu do druhého (v rámci Typo3).

Naištalovali sme nový modul a chceme aby používal dáta z iného modulu, tabuľky sú podobné, lebo nový modul je vlastne funkčným rozšírením pôvodného modulu. Dôvody, prečo je to tak sú teraz vedľajšie. Ide mi len o to - demonštrovať na rpíklade o najjednoduchší možný prípad presunu údajov z jednej tabuľky do druhej len pomocou jednoduchého SQl príkazu v rámci jednej DB.

Presun údajov

Predpokladám, že obidva moduly sú správne nainštalované. Najprv skopírujeme súbory z uploads/tx_simplegallery (starší modul) do uploads/tx_rtgsmgallery (nový modul).

Štruktúra pôvodnej tabuľky

Zvýraznené sú importované položky (okrem štandardných typo3 stĺpcov tabuľky, ktoré sa kopírujú pod rovnakým názvom: uid, tstamp, crdate, cruser_id, deleted, hidden), zakomentované sú názvy položiek z novej tabuľky. Stĺpec pid novej tabuľky nastavíme konštantou (pozri nižšie - 682), chceme totiž, aby nové záznamy boli na samostatnej stránke.

CREATE TABLE tx_simplegallery_image (
uid int(11) NOT NULL auto_increment,
pid int(11) NOT NULL default '0',
tstamp int(11) NOT NULL default '0',
crdate int(11) NOT NULL default '0',
cruser_id int(11) NOT NULL default '0',
deleted tinyint(4) NOT NULL default '0',
hidden tinyint(4) NOT NULL default '0',
name tinytext NOT NULL, // title
author tinytext NOT NULL, // author
image blob NOT NULL, // image
description text NOT NULL, // description
price tinytext NOT NULL, // starting_price
topten tinyint(3) NOT NULL default '0', // topten

);
Nová tabuľka
CREATE TABLE tx_rtgsmgallery_products (
uid int(11) NOT NULL auto_increment,
pid int(11) NOT NULL default '0',
tstamp int(11) NOT NULL default '0',
crdate int(11) NOT NULL default '0',
cruser_id int(11) NOT NULL default '0',
deleted tinyint(4) NOT NULL default '0',
hidden tinyint(4) NOT NULL default '0',
title varchar(80) NOT NULL default '',
description text NOT NULL,
image blob NOT NULL,
author varchar(80) NOT NULL default '',

technique varchar(80) NOT NULL default '',
size_x double(11,2) NOT NULL default '0.00',
size_y double(11,2) NOT NULL default '0.00',
starting_price double(11,2) NOT NULL default '0.00',
year int(11) NOT NULL default '0',
startdatetime int(11) NOT NULL default '0',
stopdatetime int(11) NOT NULL default '0',
topten tinyint(3) NOT NULL default '0',
);
Presun dát

Číslo 682 je uid stránky pre uloženie nových záznamov. Za SQL príkazom je výsledok príkazu, ako ho zobrazuje phpMyAdmin.


INSERT INTO tx_rtgsmgallery_products (uid, pid, tstamp, crdate, cruser_id, deleted, hidden, title, author, image, description, starting_price, topten, technique)
SELECT uid, 682, tstamp, crdate, cruser_id, deleted, hidden, name, author, image, description, price, topten, price
FROM tx_simplegallery_image;
# Vloženo řádků: 191 (Dotaz zabral 0.0034 sekund)

Ešte potrebujeme nastaviť dve časové pečiatky všetkým importovaným záznamom v novej tabuľke, v podstate by sa to dalo aj v prvom kroku, ale zabudol som na - náprava je však veľmi jednoduchá:

UPDATE tx_rtgsmgallery_products 
SET startdatetime = UNIX_TIMESTAMP( '2009-01-14 09:00:00' ),
stopdatetime = UNIX_TIMESTAMP( '2009-03-14 16:00:00' )
WHERE pid = 682;
# Ovlivněné řádky: 191 (Dotaz zabral 0.0047 sekund)