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

PL/Python &postgreSQL:Apa cara terbaik untuk mengembalikan tabel dengan banyak kolom?

Coba ini:

CREATE OR REPLACE FUNCTION myFunc02() 
RETURNS TABLE (like mysales) AS 
$$
rv = plpy.execute('SELECT * FROM mysales ORDER BY id;', 5)
d  = rv.nrows()
return rv[0:d]
$$ LANGUAGE 'plpythonu';

yang mengembalikan:

gpadmin=# SELECT * FROM myFunc02();                             
 id | year | qtr | day |    region
----+------+-----+-----+---------------
  1 | 2014 |   1 |   1 | north america
  2 | 2002 |   2 |   2 | europe
  3 | 2014 |   3 |   3 | asia
  4 | 2010 |   4 |   4 | north-america
  5 | 2014 |   1 |   5 | europe
(5 rows)

Sesuatu yang perlu dipertimbangkan untuk MPP seperti Greenplum dan HAWQ adalah mengupayakan fungsi yang mengambil data sebagai argumen dan mengembalikan hasil, daripada membuat data dalam fungsi itu sendiri. Kode yang sama dijalankan di setiap segmen sehingga terkadang ada efek samping yang tidak diinginkan.

Pembaruan untuk SETOF varian:

CREATE TYPE myType AS (id integer, x integer, y integer, s text);

CREATE OR REPLACE FUNCTION myFunc02a() 
RETURNS SETOF myType AS 
$$

# column names of myType ['id', 'x', 'y', 's']
rv = plpy.execute("SELECT id, year as x, qtr as y, region as s FROM mysales ORDER BY id", 5)
d  = rv.nrows()

return rv[0:d]
$$ LANGUAGE 'plpythonu';

Catatan, untuk menggunakan data yang sama dari contoh asli, saya harus membuat alias setiap kolom dengan nama yang sesuai di myType . Juga, Anda harus menghitung semua kolom mysales jika mengikuti rute ini - tidak ada cara langsung untuk CREATE TYPE foo LIKE tableBar meskipun Anda mungkin dapat menggunakan ini untuk meringankan beberapa pekerjaan manual menghitung semua nama/tipe:

select string_agg(t.attname || ' ' || t.format_type || ', ') as columns  from 
(
SELECT a.attname,
  pg_catalog.format_type(a.atttypid, a.atttypmod),
  (SELECT substring(pg_catalog.pg_get_expr(d.adbin, d.adrelid) for 128)
   FROM pg_catalog.pg_attrdef d
   WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef),
  a.attnotnull, a.attnum,
  a.attstorage ,
  pg_catalog.col_description(a.attrelid, a.attnum)
FROM pg_catalog.pg_attribute a
LEFT OUTER JOIN pg_catalog.pg_attribute_encoding e
ON   e.attrelid = a .attrelid AND e.attnum = a.attnum
WHERE a.attrelid = (SELECT oid FROM pg_class WHERE relname = 'mysales') AND a.attnum > 0 AND NOT a.attisdropped
ORDER BY a.attnum
) t ;

yang mengembalikan:

                              columns
-------------------------------------------------------------------
 id integer, year integer, qtr integer, day integer, region text,
(1 row)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tambahkan Properti ke Objek yang dikembalikan oleh Sequelize FindOne

  2. ProgrammingError:kesalahan sintaks pada atau di dekat saat menjalankan kueri dengan python menggunakan psycopg2

  3. Masukkan data dalam 3 tabel sekaligus menggunakan Postgres

  4. RedShift - Beban CSV dengan Line Break

  5. Vertx JDBC client queryWithParams - bagaimana cara menambahkan daftar?