336 lines
17 KiB
Python
336 lines
17 KiB
Python
from database_manager import DatabaseManager
|
||
from config import DatabaseConfig
|
||
import logging
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
class SampleDataInitializer:
|
||
"""示例数据初始化器"""
|
||
|
||
def __init__(self):
|
||
self.db_manager = DatabaseManager()
|
||
|
||
def init_mysql_sample_data(self, config: dict = None):
|
||
"""初始化MySQL示例数据"""
|
||
try:
|
||
# 获取配置
|
||
if config is None:
|
||
config = DatabaseConfig.get_config("mysql")
|
||
|
||
# 创建连接
|
||
conn_id = self.db_manager.create_connection(
|
||
db_type="mysql",
|
||
host=config["host"],
|
||
port=config["port"],
|
||
username=config["username"],
|
||
password=config["password"],
|
||
database=config["database"]
|
||
)
|
||
|
||
# 创建示例表
|
||
create_users_table = """
|
||
CREATE TABLE IF NOT EXISTS users (
|
||
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
|
||
name VARCHAR(100) NOT NULL COMMENT '用户姓名',
|
||
email VARCHAR(150) UNIQUE NOT NULL COMMENT '邮箱地址',
|
||
age INT COMMENT '年龄',
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
|
||
) COMMENT='用户信息表';
|
||
"""
|
||
|
||
create_products_table = """
|
||
CREATE TABLE IF NOT EXISTS products (
|
||
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '产品ID',
|
||
name VARCHAR(200) NOT NULL COMMENT '产品名称',
|
||
price DECIMAL(10,2) NOT NULL COMMENT '价格',
|
||
category VARCHAR(100) COMMENT '分类',
|
||
description TEXT COMMENT '产品描述',
|
||
stock_quantity INT DEFAULT 0 COMMENT '库存数量',
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
|
||
) COMMENT='产品信息表';
|
||
"""
|
||
|
||
# 执行建表语句
|
||
self.db_manager.execute_non_query(conn_id, create_users_table)
|
||
self.db_manager.execute_non_query(conn_id, create_products_table)
|
||
|
||
# 插入示例数据
|
||
insert_users = """
|
||
INSERT IGNORE INTO users (name, email, age) VALUES
|
||
('张三', 'zhangsan@example.com', 25),
|
||
('李四', 'lisi@example.com', 30),
|
||
('王五', 'wangwu@example.com', 28),
|
||
('赵六', 'zhaoliu@example.com', 35),
|
||
('钱七', 'qianqi@example.com', 22);
|
||
"""
|
||
|
||
insert_products = """
|
||
INSERT IGNORE INTO products (name, price, category, description, stock_quantity) VALUES
|
||
('苹果手机', 5999.00, '电子产品', '最新款智能手机', 50),
|
||
('笔记本电脑', 8999.00, '电子产品', '高性能办公笔记本', 30),
|
||
('无线耳机', 299.00, '电子产品', '蓝牙无线耳机', 100),
|
||
('咖啡杯', 39.90, '生活用品', '陶瓷咖啡杯', 200),
|
||
('书包', 129.00, '生活用品', '学生书包', 80);
|
||
"""
|
||
|
||
self.db_manager.execute_non_query(conn_id, insert_users)
|
||
self.db_manager.execute_non_query(conn_id, insert_products)
|
||
|
||
logger.info(f"MySQL示例数据初始化成功: {conn_id}")
|
||
return conn_id
|
||
|
||
except Exception as e:
|
||
logger.error(f"MySQL示例数据初始化失败: {str(e)}")
|
||
return None
|
||
|
||
def init_oracle_sample_data(self, config: dict = None):
|
||
"""初始化Oracle示例数据"""
|
||
try:
|
||
# 获取配置
|
||
if config is None:
|
||
config = DatabaseConfig.get_config("oracle")
|
||
|
||
logger.info(f"开始初始化Oracle示例数据,配置: host={config['host']}, port={config['port']}, service_name={config['service_name']}")
|
||
|
||
# 创建连接,传递额外参数
|
||
conn_id = self.db_manager.create_connection(
|
||
db_type="oracle",
|
||
host=config["host"],
|
||
port=config["port"],
|
||
username=config["username"],
|
||
password=config["password"],
|
||
database=config["service_name"],
|
||
# 添加Oracle特定参数
|
||
mode=config.get("mode"),
|
||
threaded=config.get("threaded", True)
|
||
)
|
||
|
||
logger.info(f"Oracle连接创建成功,连接ID: {conn_id}")
|
||
|
||
# 创建示例表
|
||
create_employees_table = """
|
||
CREATE TABLE employees (
|
||
employee_id NUMBER PRIMARY KEY,
|
||
first_name VARCHAR2(50) NOT NULL,
|
||
last_name VARCHAR2(50) NOT NULL,
|
||
email VARCHAR2(100) UNIQUE NOT NULL,
|
||
phone_number VARCHAR2(20),
|
||
hire_date DATE DEFAULT SYSDATE,
|
||
job_id VARCHAR2(10),
|
||
salary NUMBER(8,2),
|
||
department_id NUMBER
|
||
)
|
||
"""
|
||
|
||
create_departments_table = """
|
||
CREATE TABLE departments (
|
||
department_id NUMBER PRIMARY KEY,
|
||
department_name VARCHAR2(100) NOT NULL,
|
||
manager_id NUMBER,
|
||
location_id NUMBER
|
||
)
|
||
"""
|
||
|
||
# 创建序列
|
||
create_emp_seq = "CREATE SEQUENCE emp_seq START WITH 1 INCREMENT BY 1"
|
||
create_dept_seq = "CREATE SEQUENCE dept_seq START WITH 1 INCREMENT BY 1"
|
||
|
||
try:
|
||
self.db_manager.execute_non_query(conn_id, "DROP TABLE employees")
|
||
self.db_manager.execute_non_query(conn_id, "DROP TABLE departments")
|
||
self.db_manager.execute_non_query(conn_id, "DROP SEQUENCE emp_seq")
|
||
self.db_manager.execute_non_query(conn_id, "DROP SEQUENCE dept_seq")
|
||
except:
|
||
pass # 忽略删除错误
|
||
|
||
# 执行建表和序列语句
|
||
self.db_manager.execute_non_query(conn_id, create_departments_table)
|
||
self.db_manager.execute_non_query(conn_id, create_employees_table)
|
||
self.db_manager.execute_non_query(conn_id, create_dept_seq)
|
||
self.db_manager.execute_non_query(conn_id, create_emp_seq)
|
||
|
||
# 插入示例数据
|
||
insert_departments = """
|
||
INSERT INTO departments (department_id, department_name, manager_id, location_id) VALUES
|
||
(dept_seq.NEXTVAL, '人力资源部', NULL, 1700)
|
||
"""
|
||
|
||
insert_departments2 = """
|
||
INSERT INTO departments (department_id, department_name, manager_id, location_id) VALUES
|
||
(dept_seq.NEXTVAL, '技术部', NULL, 1800)
|
||
"""
|
||
|
||
insert_departments3 = """
|
||
INSERT INTO departments (department_id, department_name, manager_id, location_id) VALUES
|
||
(dept_seq.NEXTVAL, '销售部', NULL, 1900)
|
||
"""
|
||
|
||
self.db_manager.execute_non_query(conn_id, insert_departments)
|
||
self.db_manager.execute_non_query(conn_id, insert_departments2)
|
||
self.db_manager.execute_non_query(conn_id, insert_departments3)
|
||
|
||
insert_employees = """
|
||
INSERT INTO employees (employee_id, first_name, last_name, email, phone_number, job_id, salary, department_id) VALUES
|
||
(emp_seq.NEXTVAL, '张', '三', 'zhang.san@company.com', '13800138001', 'IT_PROG', 8000, 2)
|
||
"""
|
||
|
||
insert_employees2 = """
|
||
INSERT INTO employees (employee_id, first_name, last_name, email, phone_number, job_id, salary, department_id) VALUES
|
||
(emp_seq.NEXTVAL, '李', '四', 'li.si@company.com', '13800138002', 'SA_REP', 6000, 3)
|
||
"""
|
||
|
||
insert_employees3 = """
|
||
INSERT INTO employees (employee_id, first_name, last_name, email, phone_number, job_id, salary, department_id) VALUES
|
||
(emp_seq.NEXTVAL, '王', '五', 'wang.wu@company.com', '13800138003', 'HR_REP', 5500, 1)
|
||
"""
|
||
|
||
self.db_manager.execute_non_query(conn_id, insert_employees)
|
||
self.db_manager.execute_non_query(conn_id, insert_employees2)
|
||
self.db_manager.execute_non_query(conn_id, insert_employees3)
|
||
|
||
# 添加表注释
|
||
self.db_manager.execute_non_query(conn_id, "COMMENT ON TABLE employees IS '员工信息表'")
|
||
self.db_manager.execute_non_query(conn_id, "COMMENT ON TABLE departments IS '部门信息表'")
|
||
|
||
# 添加列注释
|
||
self.db_manager.execute_non_query(conn_id, "COMMENT ON COLUMN employees.employee_id IS '员工ID'")
|
||
self.db_manager.execute_non_query(conn_id, "COMMENT ON COLUMN employees.first_name IS '名'")
|
||
self.db_manager.execute_non_query(conn_id, "COMMENT ON COLUMN employees.last_name IS '姓'")
|
||
self.db_manager.execute_non_query(conn_id, "COMMENT ON COLUMN employees.email IS '邮箱地址'")
|
||
self.db_manager.execute_non_query(conn_id, "COMMENT ON COLUMN employees.salary IS '薪资'")
|
||
|
||
logger.info(f"Oracle示例数据初始化成功: {conn_id}")
|
||
return conn_id
|
||
|
||
except Exception as e:
|
||
logger.error(f"Oracle示例数据初始化失败: {str(e)}")
|
||
return None
|
||
|
||
def init_sqlserver_sample_data(self, config: dict = None):
|
||
"""初始化SQL Server示例数据"""
|
||
try:
|
||
# 获取配置
|
||
if config is None:
|
||
config = DatabaseConfig.get_config("sqlserver")
|
||
|
||
logger.info(f"开始初始化SQL Server示例数据,配置: host={config['host']}, port={config['port']}, database={config['database']}")
|
||
|
||
# 创建连接
|
||
conn_id = self.db_manager.create_connection(
|
||
db_type="sqlserver",
|
||
host=config["host"],
|
||
port=config["port"],
|
||
username=config["username"],
|
||
password=config["password"],
|
||
database=config["database"]
|
||
)
|
||
|
||
logger.info(f"SQL Server连接创建成功,连接ID: {conn_id}")
|
||
|
||
# 创建示例表
|
||
create_customers_table = """
|
||
IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='customers' AND xtype='U')
|
||
CREATE TABLE customers (
|
||
customer_id INT IDENTITY(1,1) PRIMARY KEY,
|
||
company_name NVARCHAR(100) NOT NULL,
|
||
contact_name NVARCHAR(50),
|
||
contact_title NVARCHAR(30),
|
||
address NVARCHAR(100),
|
||
city NVARCHAR(50),
|
||
region NVARCHAR(50),
|
||
postal_code NVARCHAR(20),
|
||
country NVARCHAR(50),
|
||
phone NVARCHAR(30),
|
||
email NVARCHAR(100),
|
||
created_date DATETIME DEFAULT GETDATE()
|
||
)
|
||
"""
|
||
|
||
create_orders_table = """
|
||
IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='orders' AND xtype='U')
|
||
CREATE TABLE orders (
|
||
order_id INT IDENTITY(1,1) PRIMARY KEY,
|
||
customer_id INT,
|
||
order_date DATETIME DEFAULT GETDATE(),
|
||
required_date DATETIME,
|
||
shipped_date DATETIME,
|
||
ship_via INT,
|
||
freight DECIMAL(10,2),
|
||
ship_name NVARCHAR(100),
|
||
ship_address NVARCHAR(100),
|
||
ship_city NVARCHAR(50),
|
||
ship_region NVARCHAR(50),
|
||
ship_postal_code NVARCHAR(20),
|
||
ship_country NVARCHAR(50),
|
||
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
|
||
)
|
||
"""
|
||
|
||
# 执行建表语句
|
||
self.db_manager.execute_non_query(conn_id, create_customers_table)
|
||
self.db_manager.execute_non_query(conn_id, create_orders_table)
|
||
|
||
# 插入示例数据 - 客户表
|
||
customers_data = [
|
||
"INSERT INTO customers (company_name, contact_name, contact_title, address, city, region, postal_code, country, phone, email) VALUES ('北京科技有限公司', '张三', '总经理', '北京市朝阳区建国路1号', '北京', '华北', '100001', '中国', '010-12345678', 'zhangsan@bjtech.com')",
|
||
"INSERT INTO customers (company_name, contact_name, contact_title, address, city, region, postal_code, country, phone, email) VALUES ('上海贸易公司', '李四', '销售经理', '上海市浦东新区陆家嘴路100号', '上海', '华东', '200001', '中国', '021-87654321', 'lisi@shtrade.com')",
|
||
"INSERT INTO customers (company_name, contact_name, contact_title, address, city, region, postal_code, country, phone, email) VALUES ('广州制造企业', '王五', '采购主管', '广州市天河区珠江路200号', '广州', '华南', '510001', '中国', '020-11223344', 'wangwu@gzmfg.com')",
|
||
"INSERT INTO customers (company_name, contact_name, contact_title, address, city, region, postal_code, country, phone, email) VALUES ('深圳创新公司', '赵六', '技术总监', '深圳市南山区科技园300号', '深圳', '华南', '518001', '中国', '0755-99887766', 'zhaoliu@szinno.com')",
|
||
"INSERT INTO customers (company_name, contact_name, contact_title, address, city, region, postal_code, country, phone, email) VALUES ('成都服务公司', '钱七', '客户经理', '成都市锦江区春熙路400号', '成都', '西南', '610001', '中国', '028-55443322', 'qianqi@cdservice.com')"
|
||
]
|
||
|
||
for sql in customers_data:
|
||
self.db_manager.execute_non_query(conn_id, sql)
|
||
|
||
# 插入示例数据 - 订单表
|
||
orders_data = [
|
||
"INSERT INTO orders (customer_id, required_date, freight, ship_name, ship_address, ship_city, ship_region, ship_postal_code, ship_country) VALUES (1, DATEADD(day, 7, GETDATE()), 25.50, '北京科技有限公司', '北京市朝阳区建国路1号', '北京', '华北', '100001', '中国')",
|
||
"INSERT INTO orders (customer_id, required_date, freight, ship_name, ship_address, ship_city, ship_region, ship_postal_code, ship_country) VALUES (2, DATEADD(day, 10, GETDATE()), 35.75, '上海贸易公司', '上海市浦东新区陆家嘴路100号', '上海', '华东', '200001', '中国')",
|
||
"INSERT INTO orders (customer_id, required_date, freight, ship_name, ship_address, ship_city, ship_region, ship_postal_code, ship_country) VALUES (3, DATEADD(day, 5, GETDATE()), 18.25, '广州制造企业', '广州市天河区珠江路200号', '广州', '华南', '510001', '中国')",
|
||
"INSERT INTO orders (customer_id, required_date, freight, ship_name, ship_address, ship_city, ship_region, ship_postal_code, ship_country) VALUES (4, DATEADD(day, 14, GETDATE()), 42.00, '深圳创新公司', '深圳市南山区科技园300号', '深圳', '华南', '518001', '中国')",
|
||
"INSERT INTO orders (customer_id, required_date, freight, ship_name, ship_address, ship_city, ship_region, ship_postal_code, ship_country) VALUES (5, DATEADD(day, 12, GETDATE()), 28.90, '成都服务公司', '成都市锦江区春熙路400号', '成都', '西南', '610001', '中国')"
|
||
]
|
||
|
||
for sql in orders_data:
|
||
self.db_manager.execute_non_query(conn_id, sql)
|
||
|
||
logger.info(f"SQL Server示例数据初始化成功: {conn_id}")
|
||
return conn_id
|
||
|
||
except Exception as e:
|
||
logger.error(f"SQL Server示例数据初始化失败: {str(e)}")
|
||
return None
|
||
|
||
def initialize_all_sample_data(self):
|
||
"""初始化所有示例数据"""
|
||
# 检查是否启用示例数据
|
||
if not DatabaseConfig.is_sample_data_enabled():
|
||
logger.info("示例数据初始化已禁用")
|
||
return {"mysql": None, "oracle": None, "sqlserver": None}
|
||
|
||
logger.info("开始初始化示例数据...")
|
||
|
||
# 初始化MySQL示例数据
|
||
mysql_conn = self.init_mysql_sample_data()
|
||
if mysql_conn:
|
||
logger.info("MySQL示例数据初始化完成")
|
||
else:
|
||
logger.warning("MySQL示例数据初始化失败,请检查数据库连接配置")
|
||
|
||
# 初始化Oracle示例数据
|
||
oracle_conn = self.init_oracle_sample_data()
|
||
if oracle_conn:
|
||
logger.info("Oracle示例数据初始化完成")
|
||
else:
|
||
logger.warning("Oracle示例数据初始化失败,请检查数据库连接配置")
|
||
|
||
# 初始化SQL Server示例数据
|
||
sqlserver_conn = self.init_sqlserver_sample_data()
|
||
if sqlserver_conn:
|
||
logger.info("SQL Server示例数据初始化完成")
|
||
else:
|
||
logger.warning("SQL Server示例数据初始化失败,请检查数据库连接配置")
|
||
|
||
logger.info("示例数据初始化流程完成")
|
||
return {"mysql": mysql_conn, "oracle": oracle_conn, "sqlserver": sqlserver_conn} |