PostgreSQL දත්ත ගබඩාවක සිට CSV ගොනුවකට PL / pgSQL ප්රතිදානය සුරැකීමට ඇති පහසුම ක්රමය කුමක්ද?
මම විමසීම් ක්රියාත්මක කරන pgAdmin III සහ PSQL ප්ලගිනය සමඟ PostgreSQL 8.4 භාවිතා කරමි.
Answers:
එහි ප්රති ing ලයක් ලෙස ඇති ගොනුව සේවාදායකයේ හෝ සේවාදායකයාගේ අවශ්යද?
ඔබට නැවත භාවිතා කිරීමට හෝ ස්වයංක්රීය කිරීමට පහසු යමක් අවශ්ය නම්, ඔබට COPY විධානයෙන් සාදන ලද Postgresql භාවිතා කළ හැකිය . උදා
Copy (Select * From foo) To '/tmp/test.csv' With CSV DELIMITER ',' HEADER;
මෙම ප්රවේශය මුළුමනින්ම දුරස්ථ සේවාදායකයේ ක්රියාත්මක වේ - එයට ඔබේ ප්රාදේශීය පරිගණකයට ලිවිය නොහැක. එය පෝස්ට්ග්රෙස් “සුපර් යූසර්” ලෙස (සාමාන්යයෙන් “රූට්” ලෙස හැඳින්වේ) ධාවනය කළ යුතුය. මන්ද එම යන්ත්රයේ දේශීය ගොනු පද්ධතිය සමඟ නපුරු දේ කිරීම පෝස්ට්ග්රෙස්ට නතර කළ නොහැකි බැවිනි.
ඇත්ත වශයෙන්ම, ඔබ භාවිතා කර ගත හැකි නිසා ඔබ, එය ලෙසද හැඳින්වේ (වෙනස් ආකාරයේ ආරක්ෂාවට තර්ජනයක් බව automating) ලෙස සම්බන්ධ විය යුතු අදහස් කරන්නේ නැහැ එම SECURITY DEFINER
කිරීම විකල්පයCREATE FUNCTION
වන කාර්යය කිරීමට ඔබට ලෙසද හැඳින්වේ යන හැඟීමෙන් ලකුණු .
තීරණාත්මක කොටස නම්, ඔබේ කාර්යය ආරක්ෂාව ඉක්මවා යාම පමණක් නොව අතිරේක චෙක්පත් සිදු කිරීමය - එබැවින් ඔබට අවශ්ය දත්ත අපනයනය කරන ශ්රිතයක් ලිවිය හැකිය, නැතහොත් විවිධ විකල්ප පිළිගත හැකි යමක් ලිවිය හැකිය. දැඩි සුදු ලැයිස්තුවක් හමුවන්න. ඔබ කරුණු දෙකක් පරීක්ෂා කළ යුතුය:
GRANT
දත්ත සමුදායේ s මගින් අර්ථ දැක්වෙනු ඇත , නමුත් ශ්රිතය දැන් සුපර් යූසර් ලෙස ක්රියාත්මක වන බැවින් සාමාන්යයෙන් “සීමාවෙන් ඔබ්බට” ඇති වගු සම්පූර්ණයෙන්ම ප්රවේශ විය හැකිය. ඔබගේ “පරිශීලකයින්” වගුවේ අවසානයේ ඔබේ ක්රියාව ක්රියාත්මක කිරීමට සහ පේළි එක් කිරීමට යමෙකුට ඉඩ දීමට ඔබට අවශ්ය නොවනු ඇත…දැඩි කොන්දේසි සපුරාලන ලිපිගොනු සහ වගු අපනයනය කරන (හෝ ආනයනය කරන) කාර්යයන් පිළිබඳ උදාහරණ ද ඇතුළුව මෙම ප්රවේශය පුළුල් කරමින් මම බ්ලොග් සටහනක් ලියා ඇත .
අනෙක් ප්රවේශය නම් සේවාදායකයාගේ පැත්තෙන් ගොනු හැසිරවීම , එනම් ඔබේ යෙදුමේ හෝ ස්ක්රිප්ටයේ ය. Postgres සේවාදායකයට ඔබ පිටපත් කරන්නේ කුමන ගොනුවකටදැයි දැන ගැනීමට අවශ්ය නැත, එය දත්ත පිට කරන අතර සේවාදායකයා එය කොතැනක හෝ තබයි.
මේ සඳහා පාදක වන වාක්ය COPY TO STDOUT
ඛණ්ඩය විධානය වන අතර pgAdmin වැනි චිත්රක මෙවලම් එය ඔබ වෙනුවෙන් ලස්සන සංවාදයකින් ඔතා ඇත.
මෙම psql
විධාන රේඛාව සේවාදායකයා විශේෂ ඊනියා "පාර-විධාන" ඇත \copy
"සැබෑ" ලෙස එකම විකල්ප දිනයයි COPY
, නමුත් සේවාදායකයා තුළ ක්රියාත්මක කර ඇත:
\copy (Select * From foo) To '/tmp/test.csv' With CSV
;
SQL විධාන මෙන් නොව මෙටා-විධාන නව රේඛාවකින් අවසන් වන බැවින් අවසන් කිරීමක් නොමැති බව සලකන්න .
සිට මෙම ලේඛන :
කෝපි psql උපදෙස් \ පිටපත සමඟ පටලවා නොගන්න. \ පිටපත STDIN වෙතින් COPY හෝ STDOUT වෙත පිටපත් කරන්න, ඉන්පසු psql සේවාදායකයාට ප්රවේශ විය හැකි ගොනුවක දත්ත ලබා ගනී / ගබඩා කරයි. මේ අනුව, \ පිටපත භාවිතා කරන විට සේවාදායකයාට වඩා ගොනු ප්රවේශය සහ ප්රවේශවීමේ අයිතිය සේවාදායකයා මත රඳා පවතී.
ඔබේ යෙදුම් ක්රමලේඛන භාෂාවට දත්ත තල්ලු කිරීම හෝ ලබා ගැනීම සඳහා සහයද තිබිය හැක , නමුත් ඔබට සාමාන්යයෙන් සම්මත SQL ප්රකාශයක් තුළ COPY FROM STDIN
/ භාවිතා කළ නොහැක TO STDOUT
, මන්ද ආදාන / ප්රතිදාන ප්රවාහය සම්බන්ධ කිරීමට ක්රමයක් නොමැත. PHP හි PostgreSQL හසුරුවන්නා ( නෑ PDO) ඉතා මූලික ඇතුළත් pg_copy_from
හා pg_copy_to
විශාල දත්ත කාණ්ඩ සඳහා කාර්යක්ෂම විය නොහැකි වන PHP අරාව, සිට / පිටපත් කාර්යයන්.
\copy
ක්රියා කරයි - එහිදී, මාර්ග සේවාදායකයාට සාපේක්ෂ වන අතර අර්ධ සළකුණක් අවශ්ය නොවේ / අවසර නැත. මගේ සංස්කරණය බලන්න.
\copy
ලයිනර් එකක් විය යුතු බව පෙනේ . එබැවින් ඔබට අවශ්ය පරිදි වර්ගීකරණය කිරීමේ අලංකාරය ඔබට නොලැබෙන අතර එය වටා පිටපතක් / ශ්රිතයක් තැබීම.
\copy
විශේෂ පාර-වන විධානය තුළ psql
විධාන රේඛාව සේවාදායකයා . PgAdmin වැනි වෙනත් සේවාදායකයින් තුළ එය ක්රියා නොකරනු ඇත; මෙම කාර්යය කිරීම සඳහා ඔවුන්ට ග්රැෆික් විශාරදයන් වැනි මෙවලම් ඇත.
විසඳුම් කිහිපයක් තිබේ:
psql
විධානයpsql -d dbname -t -A -F"," -c "select * from users" > output.csv
මෙය ඔබට SSH හරහා භාවිතා කළ හැකි විශාල වාසියක් ඇත, වැනි ssh postgres@host command
- ඔබට ලබා ගැනීමට හැකි වේ
copy
විධානයCOPY (SELECT * from users) To '/tmp/output.csv' With CSV;
>psql dbname
psql>\f ','
psql>\a
psql>\o '/tmp/output.csv'
psql>SELECT * from users;
psql>\q
ඒවා සියල්ලම ස්ක්රිප්ට් වල භාවිතා කළ හැකිය, නමුත් මම කැමති # 1 ට ය.
පර්යන්තයේදී (db හා සම්බන්ධ වූ විට) ප්රතිදානය cvs ගොනුවට සකසන්න
1) ක්ෂේත්ර බෙදුම්කරු පහත පරිදි සකසන්න ','
:
\f ','
2) නිමැවුම් ආකෘතිය නොබැඳි ලෙස සකසන්න:
\a
3) ටුපල් පමණක් පෙන්වන්න:
\t
4) ප්රතිදානය සකසන්න:
\o '/tmp/yourOutputFile.csv'
5) ඔබේ විමසුම ක්රියාත්මක කරන්න:
:select * from YOUR_TABLE
6) ප්රතිදානය:
\o
එවිට ඔබට මෙම ස්ථානයේ ඔබේ csv ගොනුව සොයාගත හැකිය:
cd /tmp
scp
විධානය භාවිතයෙන් එය පිටපත් කරන්න හෝ නැනෝ භාවිතයෙන් සංස්කරණය කරන්න:
nano /tmp/yourOutputFile.csv
COPY
හෝ \copy
නිවැරදිව හැසිරවීම (සම්මත CSV ආකෘතියෙන් පරිවර්තනය) ළඟා; මෙය සිදු වේද?
ශීර්ෂ පා with සමඟ විශේෂිත වගුවක සියලුම තීරු ගැන ඔබ උනන්දු නම් , ඔබට භාවිතා කළ හැකිය
COPY table TO '/some_destdir/mycsv.csv' WITH CSV HEADER;
මෙය වඩා ටිකක් සරලයි
COPY (SELECT * FROM table) TO '/some_destdir/mycsv.csv' WITH CSV HEADER;
එය මගේ දැනුමට අනුව සමාන වේ.
මෙම තොරතුරු සැබවින්ම හොඳින් නිරූපණය නොවේ. මෙය ව්යුත්පන්න කිරීමට මට අවශ්ය දෙවන අවස්ථාව මෙය බැවින්, වෙන කිසිවක් නොමැති නම් මට මතක් කර දීමට මෙය මෙහි තබමි.
ඇත්ත වශයෙන්ම මෙය කිරීමට ඇති හොඳම ක්රමය (CSG postgres වලින් ඉවත් කරන්න) COPY ... TO STDOUT
විධානය භාවිතා කිරීමයි . ඔබට එය කිරීමට අවශ්ය නොවුවද මෙහි පිළිතුරු වල දැක්වෙන ආකාරයට. විධානය භාවිතා කිරීමට නිවැරදි ක්රමය නම්:
COPY (select id, name from groups) TO STDOUT WITH CSV HEADER
Ssh ට වඩා භාවිතා කිරීම සඳහා එය විශිෂ්ටයි:
$ ssh psqlserver.example.com 'psql -d mydb "COPY (select id, name from groups) TO STDOUT WITH CSV HEADER"' > groups.csv
Ssh හරහා ඩොකර් ඇතුළත භාවිතා කිරීම සඳහා එය විශිෂ්ටයි:
$ ssh pgserver.example.com 'docker exec -tu postgres postgres psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv
එය දේශීය යන්ත්රයේ පවා විශිෂ්ටයි:
$ psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv
නැත්නම් දේශීය යන්ත්රයේ ඩොකර් ඇතුලත?:
docker exec -tu postgres postgres psql -d mydb -c 'COPY groups TO STDOUT WITH CSV HEADER' > groups.csv
නැත්නම් කුබර්නෙට්ස් පොකුරක් මත, ඩොකර් තුළ, HTTPS හරහා ??:
kubectl exec -t postgres-2592991581-ws2td 'psql -d mydb -c "COPY groups TO STDOUT WITH CSV HEADER"' > groups.csv
ඉතින් බහුකාර්ය, බොහෝ කොමා!
ඔව් මම කළා, මෙන්න මගේ සටහන්:
භාවිතා /copy
ඵලදායී ලෙස ඕනෑම දෙයක් පද්ධතිය මත ගොනු මෙහෙයුම් ක්රියාත්මක කරනු psql
විධානය එය ක්රියාත්මක කරන පරිශීලක ලෙස, මත ධාවනය වන 1 . ඔබ දුරස්ථ සේවාදායකයකට සම්බන්ධ වන්නේ නම්, දුරස්ථ සේවාදායකයට psql
/ සිට ක්රියාත්මක වන පද්ධතියේ දත්ත ගොනු පිටපත් කිරීම සරල ය .
COPY
බැකෙන්ඩ් ක්රියාවලි පරිශීලක ගිණුම (පෙරනිමිය postgres
), ගොනු මාර්ග සහ අවසරයන් පරීක්ෂා කර ඒ අනුව ක්රියාත්මක වන බැවින් සේවාදායකයේ ගොනු මෙහෙයුම් ක්රියාත්මක කරයි . භාවිතා කරන්නේ TO STDOUT
නම් ගොනු අවසර චෙක්පත් මඟ හරිනු ලැබේ.
psql
CSV අවසානයේ වාසය කිරීමට අවශ්ය පද්ධතියේ ක්රියාත්මක නොවන්නේ නම් මෙම විකල්ප දෙකටම පසුකාලීන ගොනු චලනය අවශ්ය වේ . මගේ අත්දැකීම් අනුව, ඔබ බොහෝ දුරට දුරස්ථ සේවාදායකයන් සමඟ වැඩ කරන විට මෙය බොහෝ දුරට ඉඩ ඇත.
සරල CSV ප්රතිදානය සඳහා දුරස්ථ පද්ධතියකට ssh හරහා TCP / IP උමගක් වැනි දෙයක් වින්යාස කිරීම වඩාත් සංකීර්ණ වේ, නමුත් වෙනත් නිමැවුම් ආකෘති සඳහා (ද්විමය) /copy
උමං සම්බන්ධතාවයක් හරහා දේශීයව ක්රියාත්මක කිරීම වඩා හොඳ විය හැකිය psql
. ඒ හා සමානව, විශාල ආනයන සඳහා, ප්රභව ගොනුව සේවාදායකයට ගෙනයාම සහ භාවිතා COPY
කිරීම ඉහළම කාර්ය සාධන විකල්පය වේ.
Psql පරාමිතීන් සමඟ ඔබට CSV වැනි ප්රතිදානය සංයුති කළ හැකි නමුත් පේජරය අක්රීය කිරීමට මතක තබා ගැනීම සහ ශීර්ෂ ලබා නොගැනීම වැනි අවාසි ඇත:
$ psql -P pager=off -d mydb -t -A -F',' -c 'select * from groups;'
2,Technician,Test 2,,,t,,0,,
3,Truck,1,2017-10-02,,t,,0,,
4,Truck,2,2017-10-02,,t,,0,,
නැත, මට අවශ්ය වන්නේ මෙවලමක් සම්පාදනය කිරීම සහ / හෝ ස්ථාපනය නොකර CSV මගේ සේවාදායකයෙන් ඉවත් කර ගැනීමයි.
නව අනුවාදය - psql 12 - සහාය වනු ඇත --csv
.
--csv
CSV (කොමා-වෙන් කළ අගයන්) ප්රතිදාන ප්රකාරයට මාරු වේ. මෙය \ pset ආකෘතිය csv ට සමාන වේ .
csv_fieldsep
CSV ප්රතිදාන ආකෘතියේ භාවිතා කළ යුතු ක්ෂේත්ර බෙදුම්කරු නියම කරයි. බෙදුම්කරුගේ අක්ෂරය ක්ෂේත්රයක අගයක දිස්වන්නේ නම්, එම ක්ෂේත්රය සම්මත CSV රීති අනුගමනය කරමින් ද්විත්ව මිල ගණන් යටතේ ප්රතිදානය වේ. පෙරනිමිය කොමාවකි.
භාවිතය:
psql -c "SELECT * FROM pg_catalog.pg_tables" --csv postgres
psql -c "SELECT * FROM pg_catalog.pg_tables" --csv -P csv_fieldsep='^' postgres
psql -c "SELECT * FROM pg_catalog.pg_tables" --csv postgres > output.csv
psql
ඔබට මෙය කළ හැකිය:
edd@ron:~$ psql -d beancounter -t -A -F"," \
-c "select date, symbol, day_close " \
"from stockprices where symbol like 'I%' " \
"and date >= '2009-10-02'"
2009-10-02,IBM,119.02
2009-10-02,IEF,92.77
2009-10-02,IEV,37.05
2009-10-02,IJH,66.18
2009-10-02,IJR,50.33
2009-10-02,ILF,42.24
2009-10-02,INTC,18.97
2009-10-02,IP,21.39
edd@ron:~$
man psql
මෙහි භාවිතා වන විකල්ප පිළිබඳ උදව් සඳහා බලන්න .
මම AWS Redshift හි වැඩ කරමින් සිටිමි, එය COPY TO
විශේෂාංගයට සහය නොදක්වයි .
මගේ BI මෙවලම ටැබ් වලින් වෙන් කරන ලද CSV සඳහා සහය දක්වයි, එබැවින් මම පහත සඳහන් දෑ භාවිතා කළෙමි:
psql -h dblocation -p port -U user -d dbname -F $'\t' --no-align -c "SELECT * FROM TABLE" > outfile.csv
PgAdmin III හි විමසුම් කවුළුවෙන් ගොනු කිරීමට අපනයනය කිරීමට විකල්පයක් ඇත. ප්රධාන මෙනුවේ එය විමසුම -> ගොනු කිරීමට ක්රියාත්මක කරන්න හෝ එකම දේ කරන බොත්තමක් තිබේ (එය හරිත ත්රිකෝණයක් වන අතර එය නිල් පැහැති නම්ය තැටියක් ඇති අතර එය හරිත ත්රිකෝණයට වඩා වෙනස් වේ. ඔබ විමසුම් කවුළුවෙන් විමසුම ක්රියාත්මක නොකරන්නේ නම් මම IMSoP යෝජනා කළ දේ කර පිටපත් විධානය භාවිතා කරමි.
මම කුඩා මෙවලමක් ලියා ඇති අතර psql2csv
එමඟින් COPY query TO STDOUT
රටාව සංයුක්ත වන අතර එහි ප්රති CS ලය වන්නේ නිසි CSV ය. එහි අතුරු මුහුණත සමාන වේ psql
.
psql2csv [OPTIONS] < QUERY
psql2csv [OPTIONS] QUERY
විමසුම STDIN හි අන්තර්ගතය, හෝ තිබේ නම් හෝ අවසාන තර්කය යැයි උපකල්පනය කෙරේ. මේවා හැර අනෙක් සියලුම තර්ක psql වෙත යොමු කරනු ලැබේ:
-h, --help show help, then exit
--encoding=ENCODING use a different encoding than UTF8 (Excel likes LATIN1)
--no-header do not output a header
ඔබට දිගු විමසුමක් තිබේ නම් සහ ඔබ psql භාවිතා කිරීමට කැමති නම් ඔබේ විමසුම ගොනුවකට දමා පහත විධානය භාවිතා කරන්න:
psql -d my_db_name -t -A -F";" -f input-file.sql -o output-file.csv
-F","
-F";"
ජෙට් බ්රේන්ස් විසින් දත්ත සමුදා IDE එකක් වන ඩේටා ග්රිප් නිර්දේශ කරමි. ඔබට CSV ගොනුවකට SQL විමසුමක් අපනයනය කළ හැකි අතර පහසුවෙන් ssh උමං මාර්ග සැකසිය හැකිය. ප්රලේඛනය "ප්රති result ල කට්ටලය" ගැන සඳහන් කරන විට, එයින් අදහස් කරන්නේ කොන්සෝලය තුළ ඇති SQL විමසුමකින් ලැබෙන ප්රති result ලයයි.
මම DataGrip සමඟ සම්බන්ධ වී නැත, මම නිෂ්පාදනයට කැමතියි!
ඔබගේ වෙබ් බ්රව්සරයේ දත්ත සමුදා සේවාදායකයකු වන ජැක් ඩීබී මෙය සැබවින්ම පහසු කරයි. විශේෂයෙන්ම ඔබ හෙරොකු නම්.
දුරස්ථ දත්ත සමුදායන් හා සම්බන්ධ වීමට සහ ඒවා මත SQL විමසුම් ක්රියාත්මක කිරීමට එය ඔබට ඉඩ දෙයි.
මුලාශ්රය
(මූලාශ්රය: jackdb.com )
ඔබේ ඩීබී සම්බන්ධ වූ පසු, ඔබට විමසුමක් ක්රියාත්මක කර CSV හෝ TXT වෙත අපනයනය කළ හැකිය (පහළ දකුණ බලන්න).
සටහන: මම කිසිසේත් ජැක් ඩීබී සමඟ සම්බන්ධ නොවෙමි. මම දැනට ඔවුන්ගේ නොමිලේ සේවාවන් භාවිතා කරන අතර එය විශිෂ්ට නිෂ්පාදනයක් යැයි සිතමි.
@ Skeller88 හි ඉල්ලීම පරිදි, මගේ ප්රතිචාරය පිළිතුරක් ලෙස නැවත පළ කරමි, එවිට සෑම ප්රතිචාරයක්ම කියවන්නේ නැති පුද්ගලයින්ට එය අහිමි නොවනු ඇත ...
DataGrip හි ඇති ගැටළුව නම් එය ඔබේ මුදල් පසුම්බියට තදින් අල්ලා ගැනීමයි. එය නොමිලේ නොවේ. Dbeaver.io හි DBeaver හි ප්රජා සංස්කරණය උත්සාහ කරන්න. එය සියලුම ජනප්රිය දත්ත සමුදායන් සඳහා සහය දක්වන SQL ක්රමලේඛකයින්, DBAs සහ විශ්ලේෂකයින් සඳහා වන FOSS බහු-වේදිකා දත්ත සමුදා මෙවලමකි: MySQL, PostgreSQL, SQLite, Oracle, DB2, SQL Server, Sybase, MS Access, Teradata, Firebird, Hive, Presto, ආදිය.
DBeaver ප්රජා සංස්කරණය මඟින් දත්ත සමුදායකට සම්බන්ධ වීම, දත්ත ලබා ගැනීම සඳහා විමසුම් නිකුත් කිරීම සහ CSV, JSON, SQL, හෝ වෙනත් පොදු දත්ත ආකෘති වෙත සුරැකීමට ප්රති result ල කට්ටලය බාගන්න. එය පෝස්ට්ග්රෙස් සඳහා TOAD, SQL සේවාදායකය සඳහා TOAD හෝ ඔරකල් සඳහා ටෝඩ් සඳහා ශක්ය FOSS තරඟකරුවෙකි.
මට ඩීබීවර් සමඟ කිසිදු සම්බන්ධයක් නැත. මම මිල හා ක්රියාකාරිත්වයට ප්රිය කරමි, නමුත් ඔවුන් ප්රාර්ථනා කරන්නේ ප්රස්ථාර සහ ප්රස්ථාර සෘජුවම නිර්මාණය කිරීම සඳහා වාර්ෂික දායක මුදල ගෙවීමට පරිශීලකයින්ට අවශ්ය නොවී, ඩීබීවර් / සූර්යග්රහණ යෙදුම වඩාත් විවෘත කර විශ්ලේෂණ විජට් ඩීබීවර් / එක්ලිප්ස් වෙත එක් කිරීම පහසු කරවීමයි. අයදුම්පත්රය. මගේ ජාවා කේතීකරණ කුසලතා මලකඩ වන අතර සූර්යග්රහණ විජට් සාදන ආකාරය මුදා හැරීමට සති ගනනාවක් ගතවන බවක් මට හැඟෙන්නේ නැත, ඩීබීවර් ප්රජා සංස්කරණයට තෙවන පාර්ශවීය විජට් එකතු කිරීමේ හැකියාව අක්රීය කර ඇති බව සොයා ගැනීමට පමණි.
DBeaver හි ප්රජා සංස්කරණයට එකතු කිරීම සඳහා විශ්ලේෂණ විජට් නිර්මාණය කිරීමේ පියවර පිළිබඳව DBeaver භාවිතා කරන්නන්ට අවබෝධයක් තිබේද?
import json
cursor = conn.cursor()
qry = """ SELECT details FROM test_csvfile """
cursor.execute(qry)
rows = cursor.fetchall()
value = json.dumps(rows)
with open("/home/asha/Desktop/Income_output.json","w+") as f:
f.write(value)
print 'Saved to File Successfully'