Source code for ferrosoft.ops.sql
import csv
from subprocess import PIPE
from uuid import UUID
from ferrosoft.ops import commands
[docs]
def tenant_database_name(tenant_id: UUID):
return "fpm_%s" % str(tenant_id).replace("-", "_")
[docs]
def create_tenant_role_command(role_name: str, password: str, member_role: str) -> str:
return "CREATE ROLE %s LOGIN PASSWORD '%s' ROLE %s" % (
role_name,
password,
member_role,
)
[docs]
def create_tenant_database_command(database_name: str, owner_role: str):
return "CREATE DATABASE %s WITH OWNER = %s" % (
database_name,
owner_role,
)
[docs]
def reassign_owner(new_owner: str):
return "REASSIGN OWNED BY current_user TO %s" % new_owner
[docs]
def tenant_host_update_command(hostname: str) -> str:
return "UPDATE ferrobase_tenant SET database_hostname = '%s'" % hostname
[docs]
def sql_select(query: str, psql_executable: str = "psql"):
"""
Executes a SQL query and yields the result rows.
This reads the whole result set into a string buffer,
therefore should only be used for results expected to be small.
Args:
query: SELECT string
psql_executable: psql executable file name
"""
result = commands.run(
[
psql_executable,
"--csv",
# disables header row
"-t",
"-c",
query,
],
stdout=PIPE,
encoding="utf-8",
errors="replace",
)
csv_reader = csv.reader(result.stdout.splitlines())
for row in csv_reader:
yield row