- 008: Add IF NOT EXISTS to ALTER TABLE ADD COLUMN - 011: Add IF NOT EXISTS to CREATE TABLE and INDEX - 012: Add IF NOT EXISTS, DROP TRIGGER IF EXISTS - 013: Add ON CONFLICT (azdhs_id) DO NOTHING - 014: Add IF NOT EXISTS to ALTER TABLE ADD COLUMN All migrations can now be safely re-run without errors. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
54 lines
2.3 KiB
SQL
54 lines
2.3 KiB
SQL
-- Create dispensaries table as single source of truth
|
|
-- This consolidates azdhs_list (official data) + stores (menu data) into one table
|
|
CREATE TABLE IF NOT EXISTS dispensaries (
|
|
-- Primary key
|
|
id SERIAL PRIMARY KEY,
|
|
|
|
-- Link to source data
|
|
azdhs_id INTEGER UNIQUE REFERENCES azdhs_list(id),
|
|
|
|
-- AZDHS official data (source of truth for legal/address info)
|
|
name VARCHAR(255) NOT NULL,
|
|
company_name VARCHAR(255),
|
|
address VARCHAR(500) NOT NULL,
|
|
city VARCHAR(100) NOT NULL,
|
|
state VARCHAR(2) NOT NULL,
|
|
zip VARCHAR(10),
|
|
status_line VARCHAR(100),
|
|
azdhs_url TEXT,
|
|
latitude DECIMAL(10, 8),
|
|
longitude DECIMAL(11, 8),
|
|
|
|
-- Enriched data (source of truth from Google Maps)
|
|
dba_name VARCHAR(255), -- "Doing Business As" - display name
|
|
phone VARCHAR(20), -- From Google Maps, not AZDHS
|
|
email VARCHAR(255), -- From Google Maps (rare)
|
|
website TEXT, -- From Google Maps, not AZDHS
|
|
google_rating DECIMAL(2, 1), -- e.g., 4.7
|
|
google_review_count INTEGER, -- e.g., 1234
|
|
|
|
-- Menu/scraper configuration
|
|
menu_url TEXT, -- Dutchie or custom menu URL
|
|
scraper_template VARCHAR(100), -- 'sol-flower', 'curaleaf', 'deeply-rooted', 'generic-dutchie'
|
|
scraper_config JSONB, -- Store age gate settings, special navigation patterns
|
|
last_menu_scrape TIMESTAMP,
|
|
menu_scrape_status VARCHAR(50) DEFAULT 'pending', -- 'pending', 'active', 'needs_recrawl', 'failed', 'no_menu'
|
|
|
|
-- SEO and routing
|
|
slug VARCHAR(255) UNIQUE NOT NULL,
|
|
|
|
-- Metadata
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Create indexes for common queries
|
|
CREATE INDEX IF NOT EXISTS idx_dispensaries_city ON dispensaries(city);
|
|
CREATE INDEX IF NOT EXISTS idx_dispensaries_state ON dispensaries(state);
|
|
CREATE INDEX IF NOT EXISTS idx_dispensaries_slug ON dispensaries(slug);
|
|
CREATE INDEX IF NOT EXISTS idx_dispensaries_azdhs_id ON dispensaries(azdhs_id);
|
|
CREATE INDEX IF NOT EXISTS idx_dispensaries_menu_status ON dispensaries(menu_scrape_status);
|
|
|
|
-- Create index for location-based queries
|
|
CREATE INDEX IF NOT EXISTS idx_dispensaries_location ON dispensaries(latitude, longitude) WHERE latitude IS NOT NULL AND longitude IS NOT NULL;
|