class PG::Connection
See the PG::Result class for information on working with the results of a query.
# res = conn.exec(‘SELECT 1 AS a, 2 AS b, NULL AS c’)
# Equivalent to:
res = conn.exec_params(‘SELECT $1 AS a, $2 AS b, $3 AS c’, [1, 2, nil])
conn = PG::Connection.open(:dbname => ‘test’)
require ‘pg’
For example, to send query to the database on the localhost:
is recommended, but not necessary.
application programmer’s interface to PostgreSQL. Some familiarity with libpq
, the C
The PostgreSQL connection class. The interface for this class is based on
def self.conndefaults_hash
##
## keyword (as a Symbol).
## Return the Postgres connection defaults structure as a Hash keyed by option
def self.conndefaults_hash return self.conndefaults.each_with_object({}) do |info, hash| hash[ info[:keyword].to_sym ] = info[:val] end end
def self::parse_connect_args( *args )
## Parse the connection +args+ into a connection-parameter string. See PG::Connection.new
def self::parse_connect_args( *args ) return '' if args.empty? hash_arg = args.last.is_a?( Hash ) ? args.pop : {} option_string = '' options = {} # Parameter 'fallback_application_name' was introduced in PostgreSQL 9.0 # together with PQescapeLiteral(). if PG::Connection.instance_methods.find {|m| m.to_sym == :escape_literal } options[:fallback_application_name] = $0.sub( /^(.{30}).{4,}(.{30})$/ ){ $1+"..."+$2 } end if args.length == 1 case args.first when URI, /\A#{URI.regexp}\z/ uri = URI(args.first) options.merge!( Hash[URI.decode_www_form( uri.query )] ) if uri.query when /=/ # Option string style option_string = args.first.to_s else # Positional parameters options[CONNECT_ARGUMENT_ORDER.first.to_sym] = args.first end else max = CONNECT_ARGUMENT_ORDER.length raise ArgumentError, "Extra positional parameter %d: %p" % [ max + 1, args[max] ] if args.length > max CONNECT_ARGUMENT_ORDER.zip( args ) do |(k,v)| options[ k.to_sym ] = v if v end end options.merge!( hash_arg ) if uri uri.host = nil if options[:host] uri.port = nil if options[:port] uri.user = nil if options[:user] uri.password = nil if options[:password] uri.path = '' if options[:dbname] uri.query = URI.encode_www_form( options ) return uri.to_s.sub( /^#{uri.scheme}:(?!\/\/)/, "#{uri.scheme}://" ) else option_string += ' ' unless option_string.empty? && options.empty? return option_string + options.map { |k,v| "#{k}=#{quote_connstr(v)}" }.join( ' ' ) end end
def self::quote_connstr( value )
def self::quote_connstr( value ) return "'" + value.to_s.gsub( /[\\']/ ) {|m| '\\' + m } + "'" end
def conndefaults
## Returns an array of Hashes with connection defaults. See ::conndefaults
def conndefaults return self.class.conndefaults end
def conndefaults_hash
## Returns a Hash with connection defaults. See ::conndefaults_hash
def conndefaults_hash return self.class.conndefaults_hash end
def conninfo_hash
##
## keyword (as a Symbol).
## Return the Postgres connection info structure as a Hash keyed by option
def conninfo_hash return self.conninfo.each_with_object({}) do |info, hash| hash[ info[:keyword].to_sym ] = info[:val] end end
def copy_data( sql, coder=nil )
def copy_data( sql, coder=nil ) res = exec( sql ) case res.result_status when PGRES_COPY_IN begin if coder old_coder = self.encoder_for_put_copy_data self.encoder_for_put_copy_data = coder end yield res rescue Exception => err errmsg = "%s while copy data: %s" % [ err.class.name, err.message ] put_copy_end( errmsg ) get_result raise else put_copy_end get_last_result ensure self.encoder_for_put_copy_data = old_coder if coder end when PGRES_COPY_OUT begin if coder old_coder = self.decoder_for_get_copy_data self.decoder_for_get_copy_data = coder end yield res rescue Exception => err cancel while get_copy_data end while get_result end raise else res = get_last_result if !res || res.result_status != PGRES_COMMAND_OK while get_copy_data end while get_result end raise PG::NotAllCopyDataRetrieved, "Not all COPY data retrieved" end res ensure self.decoder_for_get_copy_data = old_coder if coder end else raise ArgumentError, "SQL command is no COPY statement: #{sql}" end end
def ssl_attributes
and the type of connection.
The available attributes varies depending on the SSL library being used,
Returns SSL-related information about the connection as key/value pairs
conn.ssl_attributes -> Hash
call-seq:
def ssl_attributes ssl_attribute_names.each.with_object({}) do |n,h| h[n] = ssl_attribute(n) end end