init.sql 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. -- ---------------------------------------------------------
  2. -- Initial Database and User Setup (Run as MySQL Root)
  3. -- ---------------------------------------------------------
  4. CREATE DATABASE IF NOT EXISTS food_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  5. -- 1. Create the Owner User
  6. -- Has full rights and can grant privileges to others.
  7. CREATE USER IF NOT EXISTS 'db_owner'@'%' IDENTIFIED BY 'owner_pass';
  8. GRANT ALL PRIVILEGES ON food_db.* TO 'db_owner'@'%' WITH GRANT OPTION;
  9. -- 2. Create the Reader User
  10. -- Has only connect and read permissions.
  11. CREATE USER IF NOT EXISTS 'db_reader'@'%' IDENTIFIED BY 'reader_pass';
  12. GRANT USAGE ON *.* TO 'db_reader'@'%';
  13. -- 3. Create the Loader User
  14. -- Has connect and data manipulation permissions to load files.
  15. CREATE USER IF NOT EXISTS 'db_loader'@'%' IDENTIFIED BY 'loader_pass';
  16. GRANT USAGE ON *.* TO 'db_loader'@'%';
  17. GRANT FILE ON *.* TO 'db_loader'@'%'; -- Essential for LOAD DATA INFILE from any directory
  18. -- 4. Create the App Auth User
  19. -- Segregation of Duties: Handles only users table for web application routing.
  20. CREATE USER IF NOT EXISTS 'db_app_auth'@'%' IDENTIFIED BY 'app_auth_placeholder_pass';
  21. -- Note: Replace 'app_auth_placeholder_pass' later outside this script.
  22. GRANT USAGE ON *.* TO 'db_app_auth'@'%';
  23. FLUSH PRIVILEGES;
  24. -- ---------------------------------------------------------
  25. -- Table Creation & Grants (Logically executed by db_owner)
  26. -- ---------------------------------------------------------
  27. USE food_db;
  28. -- NOTE: The syntax you provided (`read_csv_auto`) is specific to DuckDB!
  29. -- MySQL does NOT support `read_csv_auto()` to dynamically create tables from CSV.
  30. -- In MySQL, you MUST define the table schema first, and then use LOAD DATA INFILE.
  31. -- Here is the MySQL equivalent process:
  32. -- Step A.1: Create Web Users Table
  33. CREATE TABLE IF NOT EXISTS users (
  34. id INT AUTO_INCREMENT PRIMARY KEY,
  35. username VARCHAR(100) UNIQUE NOT NULL,
  36. password_hash VARCHAR(255) NOT NULL,
  37. email VARCHAR(255),
  38. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  39. ) ENGINE=InnoDB;
  40. GRANT SELECT, INSERT, UPDATE ON food_db.users TO 'db_app_auth'@'%';
  41. FLUSH PRIVILEGES;
  42. -- Step A.2: Create the table with known columns (Example structure for OpenFoodFacts)
  43. CREATE TABLE IF NOT EXISTS products (
  44. code VARCHAR(50) PRIMARY KEY,
  45. url TEXT,
  46. creator VARCHAR(255),
  47. created_t VARCHAR(50),
  48. created_datetime VARCHAR(50),
  49. last_modified_t VARCHAR(50),
  50. last_modified_datetime VARCHAR(50),
  51. product_name TEXT,
  52. generic_name TEXT,
  53. quantity VARCHAR(255),
  54. packaging TEXT,
  55. brands TEXT,
  56. categories TEXT,
  57. origins TEXT,
  58. labels TEXT,
  59. stores TEXT,
  60. countries TEXT,
  61. ingredients_text TEXT,
  62. allergens TEXT,
  63. traces TEXT,
  64. -- Add FULLTEXT index for context search on ingredients and products
  65. FULLTEXT INDEX ft_idx_search (product_name, ingredients_text)
  66. ) ENGINE=InnoDB;
  67. -- Step B: The Owner grants explicit privileges to the Reader and Loader
  68. GRANT SELECT ON food_db.products TO 'db_reader'@'%';
  69. GRANT SELECT, INSERT, UPDATE, DELETE, DROP, CREATE ON food_db.products TO 'db_loader'@'%';
  70. FLUSH PRIVILEGES;
  71. -- Step C: The Loader user would then run this MySQL command to import:
  72. /*
  73. LOAD DATA INFILE '/path/to/en.openfoodfacts.org.products.converted.csv'
  74. INTO TABLE products
  75. FIELDS TERMINATED BY '\t'
  76. ENCLOSED BY ''
  77. LINES TERMINATED BY '\n'
  78. IGNORE 1 ROWS;
  79. */