Pertanyaan ini bukan tentang bytea v. Oid v. Gumpalan v. Benda besar, dll.
Saya memiliki tabel yang berisi integer
bidang kunci utama dan bytea
bidang. Saya ingin memasukkan data ke dalam bytea
bidang. Ini mungkin, mungkin, dilakukan oleh salah satu PL/
bahasa, dan saya mungkin akan melakukan hal ini PL/Python
di masa depan.
Karena saya masih menguji dan bereksperimen, saya hanya ingin memasukkan data dari file (di server) menggunakan pernyataan SQL "standar". Saya sadar bahwa hanya administrator dengan izin menulis di server yang dapat memasukkan data dengan cara yang saya inginkan. Saya tidak khawatir tentang itu pada tahap ini karena pengguna tidak akan memasukkan bytea
data saat ini. Saya telah mencari berbagai situs StackExchange, Arsip PostgreSQL dan Internet secara umum, tetapi belum dapat menemukan jawaban.
Sunting: Diskusi ini dari 2008 menyiratkan bahwa apa yang ingin saya lakukan tidak mungkin. Bagaimana bytea
bidang yang digunakan?
Sunting: Pertanyaan serupa ini dari 2005 tetap tidak terjawab.
Diselesaikan: Rincian yang disediakan di sini di psycopg
situs web memberikan dasar untuk solusi yang saya tulis dengan Python. Dimungkinkan juga untuk memasukkan data biner ke dalam bytea
kolom menggunakan PL/Python
. Saya tidak tahu apakah ini mungkin menggunakan "murni" SQL.
sumber
blob
). Jika itu adalah kesalahan, saya dengan tulus meminta maaf.blob
tidak apa-apa, mungkindatafile
tidak relevan.Jawaban:
sebagai superuser:
lo_get
diperkenalkan di 9.4 jadi untuk versi yang lebih lama Anda perlu:kemudian:
sumber
Gunakan
pg_read_file('location_of file')::bytea
.Sebagai contoh,
Manual
sumber
pg_read_binary_file('/path/to/file')
,. Lihat postgresql.org/docs/current/static/functions-admin.htmlSolusi ini tidak persis efisien dalam hal runtime, tapi itu mudah dibandingkan dengan membuat header sendiri
COPY BINARY
. Selain itu, tidak memerlukan pustaka atau bahasa skrip di luar bash.Pertama, konversikan file menjadi hexdump, gandakan ukuran file.
xxd -p
membuat kita cukup dekat, tetapi ada beberapa baris baru yang mengganggu yang harus kita tangani:Selanjutnya, impor data dalam PostgreSQL sebagai
text
bidang yang sangat besar . Jenis ini menampung hingga satu GB per nilai bidang, jadi kami harusnya oke untuk sebagian besar tujuan:Sekarang data kami adalah string hex yang sangat besar, kami menggunakan PostgresQL
decode
untuk memasukkannya ke dalambytea
tipe:sumber
tr -d '\n'
beroperasi pada output xxd, yang mengkodekan konten biner dari input sebagai karakter heksadesimal ASCII (0-9 dan af). xxd juga terjadi pada feed garis output secara berkala untuk membuat output dapat dibaca oleh manusia, tetapi dalam hal ini kami ingin mereka dihapus. Umpan baris dalam data asli akan dalam bentuk hex, dan akan tetap tidak terpengaruh.The jawaban dengan xxd bagus dan, untuk file kecil, sangat cepat. Di bawah ini adalah contoh skrip yang saya gunakan.
sumber
Gunakan fungsi BINARY COPY Postgres . Ini secara umum setara dengan tabel eksternal Oracle .
sumber
bytea
kolom?