Mis see tööriist on?
Testandmebaasi täitmine, arvutustabeli ekspordi laadimine tabelisse või väikese andmestiku migreerimine algab sageli samamoodi: sul on CSV fail ja vajad SQL-i. See tööriist parsib su CSV (kasutades päisrida veergude nimedena) ja ehitab ühe INSERT INTO lause, mis katab iga andmerea, valmis kleepimiseks andmebaasikliendisse.
Tekstiväärtused mähitakse ühekordsetesse jutumärkidesse, kusjuures sisemised jutumärgid pääsetakse kahekordistades (nii saab O'Brienist O''Brien), mis on standardne pääsemisreegel, mida jagavad MySQL, PostgreSQL ja SQLite. Tühi CSV lahter kirjutatakse SQL märksõnana NULL, mitte tühja stringina — see on tahtlik valik, kuna tühi lahter arvutustabelis tähendab tavaliselt „väärtust pole” mitte „tühja tekstitükki”, ning NULL on see, mida enamik skeeme selle jaoks ootab.
Kas väärtus pääseb jutumärkidesse või jäetakse ilma, otsustatakse lihtsa heuristikaga, mitte päris tüübituvastusega: kui trimmitud lahter näeb välja nagu lihtne täisarv või kümnendmurd (valikuliselt algav miinusmärgiga), kirjutatakse see ilma jutumärkideta; kõik muu — sealhulgas asjad, mis lihtsalt sarnanevad numbritega, aga sisaldavad lisamärke, näiteks telefoninumbrid või juhtnullidega postiindeksid — pääseb jutumärkidesse stringina. See hoiab väljundi ausaks: see on hea lähtepunkt väikese impordi jaoks, mitte asendus oma andmete valideerimisele oma tegeliku tabeliskeemi vastu enne käivitamist.
Allikas: CSV parsimine järgib RFC 4180, mis on kõige lähedasem asi ametlikule CSV standardile; ühekordse jutumärgi kahekordistamine stringi pääsemiseks on jagatud tava, mida dokumenteerivad MySQL, PostgreSQL ja SQLite.
Miks seda kasutada?
- Kohandatud tabeli nimi — sea sihttabel üks kord ja iga rida sihib seda tabelit.
- Korrektne stringi pääsemine — väärtuste sees olevad ühekordsed jutumärgid kahekordistatakse, et SQL ei katkeks ega saaks kärbitud.
- Ennustatav NULL-i käsitlus — tühjad lahtrid muutuvad NULL-iks, mitte tühjaks stringiks, sobides sellega, kuidas enamik andmebaase puuduvat andmestikku eristab.
- Levinud SQL süntaks — siin genereeritud INSERT INTO ... VALUES ... vorm töötab muutmata kujul MySQL-is, PostgreSQL-is ja SQLite-is.
- 100% kliendipoolne — su CSV andmed (mis võivad sisaldada kliendi kirjeid või äriandmeid) parsitakse ja teisendatakse su brauseris ega laadita kunagi kuhugi üles.
Kuidas kasutada
- Kleebi CSV andmed päisreaga, nt name,age\nAlice,30\nBob,25.
- Sisesta sihttabeli nimi (vaikimisi my_table).
- Klõpsa „Genereeri SQL”.
- Kopeeri INSERT INTO lause või laadi see alla .sql failina ning käivita see oma andmebaasi vastu.
Näide
Sisend
name,age,city
Alice,30,
Bob,,NYCTulemus
INSERT INTO `my_table` (`name`, `age`, `city`)
VALUES
('Alice', 30, NULL),
('Bob', NULL, 'NYC');Pane tähele, et tühjad lahtrid said NULL-iks (mitte tühjaks stringiks), ning arvuna näiv vanuseväärtus 30 jäeti jutumärkideta, samal ajal kui iga tekstiväärtus pääses jutumärkidesse.
Praktilised nõuanded
- Kohaliku testandmebaasi täitmine: ekspordi väike näidis arvutustabelist CSV-na, teisenda see siin ja käivita INSERT lause oma arendusandmebaasi vastu.
- Vaata alati üle veergude tüübid enne genereeritud SQL-i käivitamist päris tabeli vastu — see tööriist tuletab arvu vs teksti lihtsa heuristikaga, mitte su tegeliku skeemi järgi, seega võib täisarvu veerg, mis ootab kindlat formaati, vajada käsitsi kohandamist.
- Kui sul on tuhandeid ridu, on selle tööriista genereeritud üks mitmerealine INSERT lause endiselt kehtiv SQL, kuid väga suured laused võivad tabada andmebaasi maksimaalset paketi suurust — jaga CSV enne väiksemateks pakettideks, kui satud selle piiranguga vastuollu.
Miks NULL, mitte tühi string
Levinud viga CSV-SQL skriptide käsitsi kirjutamisel on iga puuduva lahtri käsitlemine tühja stringina ''. See on tehniliselt kehtiv SQL, kuid see tavaliselt ei tähenda seda, mida soovid: täisarvuna defineeritud veerg lükkab '' otse tagasi, ja isegi tekstiveerus tähendab '' vaikimisi midagi muud kui „me ei tea seda väärtust” enamiku skeemidisainide ja aruandluspäringute jaoks (WHERE column IS NULL kontroll ei sobitu tühjade stringidega ja vastupidi). NULL-i kasutamine tühjade lahtrite jaoks sobib semantikaga, mida enamik andmebaase ja ORM-e ootab, ja väldib tüübivigu, kui numbriveerus juhtub mõnel real olema puuduv väärtus.
Korduma kippuvad küsimused
Kas see töötab iga SQL andmebaasiga?
Genereeritud süntaks — jutumärgita nurksulgudes identifikaatorid, ühekordsetes jutumärkides stringiväärtused, standardne INSERT INTO ... VALUES ... — on levinud MySQL-is, PostgreSQL-is ja SQLite-is. PostgreSQL ei nõua rangelt identifikaatorite ümber sarve (see kasutab jutumärkide vajadusel topeltjutumärke), kuid sarvega nimed on seal ka kahjutud, kuni pole tegemist ebatavaliste veergude nimedega, mis reserveeritud sõnadega kokku põrkuvad. Siin ei järgita ühtki ametlikku SQL standardit — vaid süntaksit, mis töötab muutmata kujul enamiku levinud andmebaasidega.
Miks muutub tühi lahter NULL-iks, mitte tühjaks stringiks ''?
See on tahtlik disainivalik: enamikus tegelikkuses CSV eksportides tähendab tühi lahter, et väärtus on teadmata või ei kehti, mitte sõna otseses mõttes tühja tekstitükki. NULL on see, mida enamik andmebaasiskeeme selle jaoks ootab. Kui su kasutusjuhtum tõesti vajab tühje stringe, pead nende juhtumite jaoks genereeritud SQL-i käsitsi muutma.
Kuidas tööriist otsustab, kas väärtus vajab jutumärke?
See on lihtne heuristika, mitte päris tüübituvastus: kui trimmitud lahter koosneb ainult numbritest (valikulise algava miinusega ja kõige rohkem ühe komakohaga), kirjutatakse see numbrina ilma jutumärkideta. Kõik muu pääseb jutumärkidesse stringina. See tähendab, et postiindeks nagu 00501 või telefoninumber käsitletakse tekstina (kuna see läbib range täisarvumustri ainult, kui sellel on lisamärke — üksik juhtnull ise parsub siiski siin numbrina, seega kontrolli identifikaatorid nagu postiindeksid ja ID-d enne SQL-i käivitamist üle).
Kas mu andmed laaditakse kuhugi üles?
Ei. Nii parsimine kui SQL genereerimine toimuvad JavaScriptis su brauseris — midagi ei saadeta serverisse, mis muudab selle turvaliseks kasutamiseks eksporditud kliendi- või äriandmestikega.
Kas see suudab käsitleda CSV väärtusi, mis sisaldavad komasid või jutumärke?
Jah. CSV parsitakse korraliku jutumärgitud väljade parseriga, mis mõistab jutumärkide sees olevaid komasid, reavahetusi ja kahekordistatud jutumärke — mitte naiivse komale jagamisega —, seega loetakse väli nagu "Smith, John" üheks väärtuseks, mitte ei jagata kaheks veeruks.