On Monday, February 9, 2015 at 8:29:21 AM UTC-8, Tarik Ansari wrote:
>
> Hello there,
>
> I am trying to insert an array of composite type, I have looked at the doc
> for pg_array and pg_row (and also pg_array_ops and pg_row_ops) and I am
> uncertain about the process to do it.
>
> I have a clients tables with a addresses column which is an array of a
> composite type address (itself containing an array).
>
> First, I load pg_array and pg_row module, define the composite type:
>
> DB.extension(:pg_array, :pg_row)
> DB.register_row_type(:address)
> clients = DB[:clients]
>
> Then, setup my object to insert:
>
> address1 = {
> line1: "34 rue de Paris",
> line2: null,
> zip: "75001",
> coordinates: [48.8567, 2.3508]
> }
>
> client = {
> name = "Joe",
> addresses = ? # would be [address1] in a normal ruby object
> }
>
> I have tried these solutions:
>
> addresses = Sequel.pg_array(address1, :address)
>
> and
>
> addresses = Sequel.pg_array(DB.row_type(:address, address1))
>
> and
>
> addresses = Sequel.pg_array(DB.row_type(:address, address1), :address)
>
> But they all result in a malformed queries.
>
> Any pointer would be highly appreciated.
>
There's probably a couple of issues. First, Sequel.pg_array takes an
array. Second, it looks like address.coordinates is an array of floats, so
you would need wrap that as well. Here's a self contained example that
works:
DB.create_table(:address) do
String :line1
String :line2
String :zip
column :coordinates, 'real[]'
end
DB.create_table(:clients) do
primary_key :id
String :name
column :addresses, 'address[]'
end
DB.extension :pg_array, :pg_row
Sequel.extension :pg_array_ops
DB.register_row_type(:address)
DB[:clients].insert(:name=>'Joe',
:addresses=>Sequel.pg_array([DB.row_type(:address, {:line1=>'34 rue de
Paris', :line2=>nil, :zip=>'75001', :coordinates=>Sequel.pg_array([48.8567,
2.3508])})]))
Note that if you use models, the argument wrapping is taken care of for you:
class Address < Sequel::Model(:address)
plugin :pg_row
end
class Client < Sequel::Model; end
Client.create(:name=>'Joe', :addresses=>[{:line1=>'34 rue de Paris',
:line2=>nil, :zip=>'75001', :coordinates=>[48.8567, 2.3508]}])
Thanks,
Jeremy
--
You received this message because you are subscribed to the Google Groups
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sequel-talk.
For more options, visit https://groups.google.com/d/optout.