File size: 6,173 Bytes
e8697a4 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | """
Скрипт создания демо-базы данных для Ru2SQL.
Запуск из корня проекта:
python data/demo/create_demo_db.py
"""
import random
import sqlite3
from datetime import date, timedelta
from pathlib import Path
DB_PATH = Path(__file__).parent / "sales.sqlite"
def create_db():
if DB_PATH.exists():
DB_PATH.unlink()
conn = sqlite3.connect(DB_PATH)
cur = conn.cursor()
cur.executescript("""
CREATE TABLE customers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
city TEXT,
phone TEXT,
email TEXT,
created_at TEXT DEFAULT (date('now'))
);
CREATE TABLE managers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
department TEXT
);
CREATE TABLE products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
category TEXT,
price REAL NOT NULL,
is_active INTEGER DEFAULT 1
);
-- amount — итоговая сумма заказа в рублях (не путать с order_items.price)
CREATE TABLE orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
customer_id INTEGER REFERENCES customers(id),
manager_id INTEGER REFERENCES managers(id),
amount REAL NOT NULL,
status TEXT DEFAULT 'paid',
order_date TEXT NOT NULL
);
-- price — цена за единицу товара; quantity — количество штук
CREATE TABLE order_items (
id INTEGER PRIMARY KEY AUTOINCREMENT,
order_id INTEGER REFERENCES orders(id),
product_id INTEGER REFERENCES products(id),
quantity INTEGER NOT NULL,
price REAL NOT NULL
);
""")
customers = [
("ООО Ромашка", "Москва", "+7 495 111-22-33", "romashka@example.com"),
("ИП Петров", "Санкт-Петербург", "+7 812 333-44-55", "petrov@example.com"),
("Сеть магазинов Радуга","Казань", "+7 843 555-66-77", "raduga@example.com"),
("АО Стройснаб", "Екатеринбург", "+7 343 777-88-99", "stroysnab@example.com"),
("ООО Технолайн", "Новосибирск", "+7 383 999-00-11", "technoline@example.com"),
("ИП Сидорова", "Москва", "+7 495 222-33-44", "sidorova@example.com"),
("ООО Прогресс", "Краснодар", "+7 861 444-55-66", "progress@example.com"),
("ЗАО Мегатрейд", "Самара", "+7 846 666-77-88", "megatrade@example.com"),
]
cur.executemany(
"INSERT INTO customers (name, city, phone, email) VALUES (?,?,?,?)",
customers,
)
managers = [
("Иванов Алексей", "Продажи"),
("Смирнова Мария", "Продажи"),
("Козлов Дмитрий", "Корпоративные клиенты"),
("Новикова Анна", "Корпоративные клиенты"),
]
cur.executemany("INSERT INTO managers (name, department) VALUES (?,?)", managers)
products_data = [
("Ноутбук Dell XPS 15", "Электроника", 89990.0, 1),
("Монитор LG 27inch", "Электроника", 24990.0, 1),
("Клавиатура Logitech MX", "Периферия", 8990.0, 1),
("Мышь Logitech G502", "Периферия", 5490.0, 1),
("Наушники Sony WH-1000XM5", "Аудио", 29990.0, 1),
("Веб-камера Logitech C920", "Периферия", 7990.0, 1),
("SSD Samsung 1TB", "Комплектующие", 6990.0, 1),
("Принтер HP LaserJet", "Оргтехника", 18990.0, 0),
("Роутер TP-Link AX3000", "Сетевое оборудование", 4990.0, 1),
("ИБП APC 1500VA", "Сетевое оборудование",14990.0, 1),
]
cur.executemany(
"INSERT INTO products (name, category, price, is_active) VALUES (?,?,?,?)",
products_data,
)
random.seed(42)
start = date(2025, 1, 1)
end = date(2026, 4, 30)
delta = (end - start).days
statuses = ["paid", "paid", "paid", "pending", "cancelled"]
order_id = 1
items_rows = []
for _ in range(120):
d = start + timedelta(days=random.randint(0, delta))
customer_id = random.randint(1, 8)
manager_id = random.randint(1, 4)
status = random.choice(statuses)
n_items = random.randint(1, 4)
picked = random.sample(range(1, 11), n_items)
total = 0.0
for prod_id in picked:
qty = random.randint(1, 5)
price = products_data[prod_id - 1][2]
total += qty * price
items_rows.append((order_id, prod_id, qty, price))
cur.execute(
"INSERT INTO orders (customer_id, manager_id, amount, status, order_date) "
"VALUES (?,?,?,?,?)",
(customer_id, manager_id, round(total, 2), status, d.isoformat()),
)
order_id += 1
cur.executemany(
"INSERT INTO order_items (order_id, product_id, quantity, price) VALUES (?,?,?,?)",
items_rows,
)
conn.commit()
conn.close()
print(f"База создана: {DB_PATH}")
conn2 = sqlite3.connect(DB_PATH)
for tbl in ["customers", "managers", "products", "orders", "order_items"]:
cnt = conn2.execute(f"SELECT COUNT(*) FROM {tbl}").fetchone()[0]
print(f" {tbl}: {cnt} строк")
conn2.close()
if __name__ == "__main__":
create_db()
|