PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Daftar Python ke Array PostgreSQL

Perhatikan bahwa dengan psycopg2 anda tidak perlu melakukan pemrosesan string untuk array. Ini dianggap sebagai praktik yang buruk karena rawan kesalahan dan dapat - dalam kasus terburuk - menyebabkan serangan injeksi terbuka! Anda harus selalu menggunakan parameter terikat. Pada kode di bawah ini, saya akan membuat tabel baru hanya dengan satu kolom dengan tipe TEXT[] (seperti dalam pertanyaan awal Anda). Lalu saya akan menambahkan baris baru, dan memperbarui semuanya. Jadi Anda akan melihat keduanya INSERT dan UPDATE operasi (walaupun keduanya hampir sama).

Ada satu Python gotcha meskipun jika Anda memperbarui hanya dengan satu nilai:cur.execute mengharapkan pernyataan SQL sebagai argumen pertama dan dapat diubah berisi parameter yang akan diikat sebagai argumen kedua. Berikut ini akan tidak kerja:

from psycopg2 import connect

conn = connect('dbname=exhuma')
cur = conn.cursor()
stmt = 'UPDATE foo SET example_value=%s'
new_values = ['a', 'b', 'c']
cur.execute(stmt, (new_values))
conn.commit()

Alasannya adalah (new_values) dilihat oleh python sebagai new_values (parens dijatuhkan dalam kasus ini, mereka tidak dilihat sebagai Tuple). Ini akan menghasilkan kesalahan yang Anda berikan 3 nilai ('a' , 'b' dan 'c' ) sebagai nilai yang akan diikat, tetapi hanya ada satu placeholder (%s ) dalam kueri. Sebagai gantinya, Anda harus menentukannya sebagai berikut (perhatikan tanda koma yang ditambahkan di akhir):

from psycopg2 import connect

conn = connect('dbname=exhuma')
cur = conn.cursor()
stmt = 'UPDATE foo SET example_value=%s'
new_values = ['a', 'b', 'c']
cur.execute(stmt, (new_values,))
conn.commit()

Ini akan membuat Python melihat (new_values,) sebagai Tuple (yang merupakan iterable) dengan satu elemen, yang cocok dengan place-holder kueri. Untuk penjelasan lebih rinci tentang tanda koma, lihat dokumen resmi di tupel.

Atau, Anda juga dapat menulis [new_values] bukannya (new_values,) , tapi - menurut saya - (new_values,) lebih bersih karena tupel tidak dapat diubah, sedangkan daftar dapat diubah.

Berikut tabel yang saya uji:

CREATE TABLE foo (
    values TEXT[]
);

Dan inilah kode Python yang memasukkan dan memperbarui nilai:

from psycopg2 import connect


conn = connect('dbname=exhuma')
cur = conn.cursor()

cur.execute('INSERT INTO foo VALUES (%s)', (['a', 'b'], ))

print('>>> Before update')
cur.execute('SELECT * FROM foo')
for row in cur:
    print(type(row[0]), repr(row[0]))

print('>>> After update')

cur.execute('UPDATE foo SET example_values = %s',
            (['new', 'updated', 'values'],))

cur.execute('SELECT * FROM foo')
for row in cur:
    print(type(row[0]), repr(row[0]))

cur.close()
conn.commit()
conn.close()

Pada setiap eksekusi, kode akan menyisipkan baris baru dengan nilai larik yang sama, lalu menjalankan pembaruan tanpa WHERE klausa, jadi semua nilai diperbarui. Setelah beberapa eksekusi, saya ini memberikan output berikut:

>>> Before update
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['a', 'b']")
>>> After update
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['new', 'updated', 'values']")
(<type 'list'>, "['new', 'updated', 'values']")


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL:meningkatkan pg_dump, kinerja pg_restore

  2. Bagaimana cara menginstal hanya alat klien untuk PostgreSQL di Windows?

  3. Mengintegrasikan Alat untuk Mengelola PostgreSQL dalam Produksi

  4. Bagaimana cara membuat pendengar basis data dengan java?

  5. Biaya publisitas PostgreSQL gratis