Kaj je to orodje?
Nasajanje testne baze podatkov, nalaganje izvoza preglednice v tabelo ali migracija majhnega nabora podatkov se pogosto začne enako: imaš CSV datoteko in potrebuješ SQL. To orodje razčleni tvoj CSV (uporabi vrstico glave kot imena stolpcev) in zgradi en INSERT INTO stavek, ki zajema vsako podatkovno vrstico, pripravljen za prilepitev v odjemalca baze podatkov.
Besedilne vrednosti so zavite v enojne narekovaje z notranjimi narekovaji, pobegljenimi s podvojitvijo (tako da O'Brien postane O''Brien), kar je standardno pravilo bega, ki si ga delijo MySQL, PostgreSQL in SQLite. Prazna CSV celica je zapisana kot SQL ključna beseda NULL namesto praznega niza — to je namerna izbira, saj prazna celica v preglednici običajno pomeni 'brez vrednosti' namesto 'praznega kosa besedila', NULL pa je tisto, kar večina shem pričakuje za to.
Ali je vrednost narekovana ali puščena gola, določa preprosta hevristika, ne pravo sklepanje o tipu: če obrezana celica izgleda kot navadno celo ali decimalno število (po možnosti z vodilnim minusom), je zapisana brez narekovajev; vse ostalo — vključno z stvarmi, ki le spominjajo na števila z dodatnimi znaki, kot so telefonske številke ali poštne številke z vodilnimi ničlami — je narekovano kot niz. To ohranja izhod pošten: dober je začetek za majhen uvoz, ne nadomestek za preverjanje tvojih podatkov proti dejanski shemi tabele pred zagonom.
Vir: razčlenjevanje CSV sledi RFC 4180, najbližji stvari uradnemu CSV standardu; podvajanje enojnih narekovajev za beg nizov je skupna konvencija, ki jo dokumentirajo MySQL, PostgreSQL in SQLite.
Zakaj ga uporabiti?
- Ime tabele po meri — nastavi ciljno tabelo enkrat, vsaka vrstica pa cilja to tabelo.
- Pravilen beg nizov — enojni narekovaji znotraj vrednosti so podvojeni, tako da se SQL ne pokvari ali skrajša.
- Predvidljiva obravnava NULL — prazne celice postanejo NULL namesto praznega niza, kar ustreza temu, kako večina baz podatkov razlikuje manjkajoče podatke.
- Pogosta SQL sintaksa — oblika INSERT INTO ... VALUES ..., ustvarjena tukaj, deluje nespremenjena v MySQL, PostgreSQL in SQLite.
- 100 % na strani odjemalca — tvoji CSV podatki (ki lahko vsebujejo podatke o strankah ali poslovne podatke) so razčlenjeni in pretvorjeni v tvojem brskalniku ter nikoli naloženi nikamor.
Kako ga uporabljati
- Prilepi CSV podatke z vrstico glave, npr. name,age\nAlice,30\nBob,25.
- Vnesi ime ciljne tabele (privzeto my_table).
- Klikni "Generate SQL".
- Kopiraj stavek INSERT INTO ali ga prenesi kot .sql datoteko, nato ga zaženi proti svoji bazi podatkov.
Primer
Vnos
name,age,city
Alice,30,
Bob,,NYCRezultat
INSERT INTO `my_table` (`name`, `age`, `city`)
VALUES
('Alice', 30, NULL),
('Bob', NULL, 'NYC');Opazi, da so prazne celice postale NULL (ne prazni nizi), in da je bila številčna vrednost starosti 30 puščena brez narekovajev, medtem ko je bila vsaka besedilna vrednost narekovana.
Praktični nasveti
- Nasajanje lokalne testne baze podatkov: izvozi majhen vzorec kot CSV iz preglednice, ga pretvori tukaj in zaženi INSERT stavek proti svoji razvojni bazi podatkov.
- Vedno preglej tipe stolpcev pred zagonom ustvarjenega SQL-a proti pravi tabeli — to orodje sklepa o številčnem vs. besedilnem s preprosto hevristiko, ne po tvoji dejanski shemi, tako da lahko stolpec celega števila, ki pričakuje določeno obliko, potrebuje ročno prilagoditev.
- Če imaš na tisoče vrstic, en sam večvrstični INSERT stavek, ki ga to orodje ustvari, je še vedno veljaven SQL, a zelo veliki stavki lahko presežejo največjo velikost paketa baze podatkov — najprej razdeli CSV na manjše serije, če naletiš na to omejitev.
Zakaj NULL in ne prazen niz
Pogosta napaka pri ročnem pisanju skript CSV-v-SQL je obravnavanje vsake manjkajoče celice kot praznega niza ''. To je tehnično veljaven SQL, a običajno ne pomeni tega, kar želiš: stolpec, definiran kot celo število, bo '' popolnoma zavrnil, in celo v besedilnem stolpcu '' tiho pomeni nekaj drugega kot "tega ne vemo" v večini oblikovanj shem in poizvedb poročanja (preverjanje WHERE column IS NULL se ne bo ujemalo s praznimi nizi in obratno). Uporaba NULL za prazne celice ustreza semantiki, ki jo pričakuje večina baz podatkov in ORM-ov, ter se izogne napakam tipa, kadar številčni stolpec pri nekaterih vrsticah pomanjkuje vrednosti.
Pogosta vprašanja
Ali to deluje z vsako SQL bazo podatkov?
Ustvarjena sintaksa — identifikatorji v narekovajih s poševnico nazaj, vrednosti nizov v enojnih narekovajih, standarden INSERT INTO ... VALUES ... — je skupna MySQL, PostgreSQL in SQLite. PostgreSQL striktno ne zahteva poševnic nazaj okoli identifikatorjev (uporablja dvojne narekovaje, če je narekovanje sploh potrebno), a imena v poševnicah nazaj so tam prav tako neškodljiva, dokler nimaš nenavadnih imen stolpcev, ki trčijo z rezerviranimi besedami. Ne obstaja en sam uraden SQL standard, ki se tukaj upošteva — le sintaksa, ki deluje nespremenjena v najpogostejših bazah podatkov.
Zakaj prazna celica postane NULL namesto praznega niza ''?
To je namerna oblikovalska odločitev: v večini resničnih CSV izvozov prazna celica pomeni, da je vrednost neznana ali ni na voljo, ne dobesedno prazen kos besedila. NULL je tisto, kar večina shem baz podatkov pričakuje za to. Če tvoj primer uporabe resnično potrebuje prazne nize namesto tega, boš moral ustvarjen SQL ročno urediti za te primere.
Kako orodje odloči, ali vrednost potrebuje narekovaje?
To je preprosta hevristika, ne pravo sklepanje o tipu: če obrezana celica vsebuje samo številke (z izbirnim vodilnim minusom in največ eno decimalno piko), je zapisana brez narekovajev kot število. Vse ostalo je narekovano kot niz. To pomeni, da bi bila poštna številka, kot je 00501, ali telefonska številka obravnavana kot besedilo (saj ne izpolni strogega vzorca celega števila le, če ima dodatne znake — vodilna ničla sama še vedno razčleni kot številčna tukaj, zato dvakrat preveri identifikatorje, kot so poštne številke in ID-ji, preden zaženeš SQL).
Ali so moji podatki kam naloženi?
Ne. Razčlenjevanje in generiranje SQL se oba dogajata v JavaScript v tvojem brskalniku — nič se ne pošlje na strežnik, kar to naredi varno za uporabo z izvoženimi zapisi strank ali poslovnimi zapisi.
Ali lahko obravnava CSV vrednosti, ki vsebujejo vejice ali narekovaje?
Da. CSV je razčlenjen s pravim razčlenjevalnikom polj v narekovajih, ki razume vejice, prelome vrstic in podvojene narekovaje znotraj polj v narekovajih — ne z naivnim deljenjem na vejicah — tako da je polje, kot je "Smith, John", prebrano kot ena vrednost, ne razdeljeno na dva stolpca.