Spaces:
Sleeping
Sleeping
| import os | |
| import psycopg2 | |
| from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT | |
| from dotenv import load_dotenv | |
| load_dotenv() | |
| class DatabaseSetup: | |
| def __init__(self): | |
| self.host = os.getenv('DB_HOST', 'localhost') | |
| self.port = os.getenv('DB_PORT', '5432') | |
| self.db_name = os.getenv('DB_NAME', 'cocktails_db') | |
| self.user = os.getenv('DB_USER', 'postgres') | |
| self.password = os.getenv('DB_PASSWORD', 'your_password') | |
| def create_database(self): | |
| """Create the database if it doesn't exist""" | |
| try: | |
| # Connect to default postgres database | |
| conn = psycopg2.connect( | |
| host=self.host, | |
| port=self.port, | |
| user=self.user, | |
| password=self.password, | |
| database='postgres' | |
| ) | |
| conn.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) | |
| cursor = conn.cursor() | |
| # Check if database exists | |
| cursor.execute(f"SELECT 1 FROM pg_catalog.pg_database WHERE datname = '{self.db_name}'") | |
| exists = cursor.fetchone() | |
| if not exists: | |
| cursor.execute(f'CREATE DATABASE {self.db_name}') | |
| print(f"Database '{self.db_name}' created successfully") | |
| else: | |
| print(f"Database '{self.db_name}' already exists") | |
| cursor.close() | |
| conn.close() | |
| except Exception as e: | |
| print(f"Error creating database: {e}") | |
| def setup_pgvector(self): | |
| """Setup pgvector extension and create tables""" | |
| try: | |
| conn = psycopg2.connect( | |
| host=self.host, | |
| port=self.port, | |
| user=self.user, | |
| password=self.password, | |
| database=self.db_name | |
| ) | |
| cursor = conn.cursor() | |
| # Enable pgvector extension | |
| cursor.execute("CREATE EXTENSION IF NOT EXISTS vector") | |
| # Create cocktails table with vector embeddings | |
| cursor.execute(""" | |
| CREATE TABLE IF NOT EXISTS cocktails ( | |
| id SERIAL PRIMARY KEY, | |
| name VARCHAR(255) NOT NULL, | |
| ingredients TEXT NOT NULL, | |
| recipe TEXT, | |
| glass VARCHAR(100), | |
| category VARCHAR(100), | |
| iba VARCHAR(100), | |
| alcoholic VARCHAR(50), | |
| embedding vector(384) | |
| ) | |
| """) | |
| # Create index for vector similarity search | |
| cursor.execute(""" | |
| CREATE INDEX IF NOT EXISTS cocktails_embedding_idx | |
| ON cocktails USING ivfflat (embedding vector_cosine_ops) | |
| WITH (lists = 100) | |
| """) | |
| conn.commit() | |
| cursor.close() | |
| conn.close() | |
| print("Database tables and pgvector extension set up successfully") | |
| except Exception as e: | |
| print(f"Error setting up pgvector: {e}") | |
| def get_connection(self): | |
| """Get database connection""" | |
| return psycopg2.connect( | |
| host=self.host, | |
| port=self.port, | |
| user=self.user, | |
| password=self.password, | |
| database=self.db_name | |
| ) | |
| if __name__ == "__main__": | |
| db_setup = DatabaseSetup() | |
| db_setup.create_database() | |
| db_setup.setup_pgvector() | |