import signal from django.db.backends.base.client import BaseDatabaseClient class DatabaseClient(BaseDatabaseClient): executable_name = "psql" @classmethod def settings_to_cmd_args_env(cls, settings_dict, parameters): args = [cls.executable_name] options = settings_dict.get("OPTIONS", {}) host = settings_dict.get("HOST") port = settings_dict.get("PORT") dbname = settings_dict.get("NAME") user = settings_dict.get("USER") passwd = settings_dict.get("PASSWORD") passfile = options.get("passfile") service = options.get("service") sslmode = options.get("sslmode") sslrootcert = options.get("sslrootcert") sslcert = options.get("sslcert") sslkey = options.get("sslkey") if not dbname and not service: # Connect to the default 'postgres' db. dbname = "postgres" if user: args += ["-U", user] if host: args += ["-h", host] if port: args += ["-p", str(port)] if dbname: args += [dbname] args.extend(parameters) env = {} if passwd: env["PGPASSWORD"] = str(passwd) if service: env["PGSERVICE"] = str(service) if sslmode: env["PGSSLMODE"] = str(sslmode) if sslrootcert: env["PGSSLROOTCERT"] = str(sslrootcert) if sslcert: env["PGSSLCERT"] = str(sslcert) if sslkey: env["PGSSLKEY"] = str(sslkey) if passfile: env["PGPASSFILE"] = str(passfile) return args, (env or None) def runshell(self, parameters): sigint_handler = signal.getsignal(signal.SIGINT) try: # Allow SIGINT to pass to psql to abort queries. signal.signal(signal.SIGINT, signal.SIG_IGN) super().runshell(parameters) finally: # Restore the original SIGINT handler. signal.signal(signal.SIGINT, sigint_handler)