feat(pos): add tenant manager — provision DBs from template with sql.Identifier
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
31
pos/tenant_db.py
Normal file
31
pos/tenant_db.py
Normal file
@@ -0,0 +1,31 @@
|
||||
# /home/Autopartes/pos/tenant_db.py
|
||||
"""Tenant DB connection manager. Gets a psycopg2 connection for a specific tenant."""
|
||||
|
||||
import psycopg2
|
||||
from config import MASTER_DB_URL, TENANT_DB_URL_TEMPLATE
|
||||
|
||||
|
||||
def get_master_conn():
|
||||
"""Get connection to nexus_master DB."""
|
||||
return psycopg2.connect(MASTER_DB_URL)
|
||||
|
||||
|
||||
def get_tenant_conn(tenant_id):
|
||||
"""Get connection to a tenant's DB by looking up db_name in nexus_master."""
|
||||
master = get_master_conn()
|
||||
cur = master.cursor()
|
||||
cur.execute("SELECT db_name FROM tenants WHERE id = %s AND is_active = true", (tenant_id,))
|
||||
row = cur.fetchone()
|
||||
cur.close()
|
||||
master.close()
|
||||
|
||||
if not row:
|
||||
raise ValueError(f"Tenant {tenant_id} not found or inactive")
|
||||
|
||||
db_name = row[0]
|
||||
return psycopg2.connect(TENANT_DB_URL_TEMPLATE.format(db_name=db_name))
|
||||
|
||||
|
||||
def get_tenant_conn_by_dbname(db_name):
|
||||
"""Get connection to a tenant DB directly by name."""
|
||||
return psycopg2.connect(TENANT_DB_URL_TEMPLATE.format(db_name=db_name))
|
||||
Reference in New Issue
Block a user