class PostgresDbInput(SqlDbInput): """ Input by querying records from a Postgres database. Input is a query, like SELECT * from mytable. Output is zero or more records as record array (array of dict) or single record (dict). produces=FORMAT.record_array (default) or FORMAT.record """ # Start attribute config meta @Config(ptype=str, required=False, default='localhost') def host(self): """ host name or host IP-address, defaults to 'localhost' """ pass @Config(ptype=str, required=False, default='5432') def port(self): """ port for host, defaults to `'5432' """ pass @Config(ptype=str, required=False, default='postgres') def user(self): """ User name, defaults to 'postgres' """ pass @Config(ptype=str, required=False, default='postgres') def password(self): """ User password, defaults to 'postgres' """ pass @Config(ptype=str, required=False, default='public') def schema(self): """ The postgres schema name, defaults to 'public' """ pass # End attribute config meta def __init__(self, configdict, section): SqlDbInput.__init__(self, configdict, section, produces=[FORMAT.record_array, FORMAT.record]) self.db = None def init(self): # Connect only once to DB log.info('Init: connect to DB') self.db = PostGIS(self.cfg.get_dict()) self.db.connect() # If no explicit column names given, get from DB meta info self.columns = self.column_names if self.column_names is None: self.columns = self.db.get_column_names(self.cfg.get('table'), self.cfg.get('schema')) def exit(self): # Disconnect from DB when done log.info('Exit: disconnect from DB') self.db.disconnect() def raw_query(self, query_str): self.db.execute(query_str) db_records = self.db.cursor.fetchall() log.info('read recs: %d' % len(db_records)) return db_records