bisheng 后端初始化数据(main.py > init_data.py)
bisheng 后端确实有数据库初始化机制。让我搜索一下相关的初始化代码和命令。
[6 tools called]
是的!bisheng 后端确实有完整的数据库初始化机制。让我详细解释一下:
数据库初始化流程
1. 自动初始化触发
当应用启动时,在 main.py
的 lifespan
函数中会自动调用:
@asynccontextmanager
async def lifespan(app: FastAPI):initialize_services()setup_llm_caching()init_default_data() # 这里触发数据库初始化# LangfuseInstance.update()yieldteardown_services()thread_pool.tear_down()
2. 数据库表结构创建
在 init_default_data()
函数中,首先会创建所有必要的数据库表:
def init_default_data():"""初始化数据库"""if redis_client.setNx('init_default_data', '1'):try:db_service.create_db_and_tables() # 创建数据库表结构with session_getter() as session:# ... 后续初始化数据
create_db_and_tables()
会遍历所有 SQLModel 模型,自动创建对应的表:
def create_db_and_tables(self):logger.debug('Creating database and tables')for table in SQLModel.metadata.sorted_tables:try:table.create(self.engine, checkfirst=True)except OperationalError as oe:logger.warning(f'Table {table} already exists, skipping. Exception: {oe}')except Exception as exc:logger.error(f'Error creating table {table}: {exc}')raise RuntimeError(f'Error creating table {table}') from exclogger.debug('Database and tables created successfully')
3. 初始数据填充
初始化过程会创建以下基础数据:
系统角色和权限
# 初始化系统配置, 管理员拥有所有权限
db_role = Role(id=AdminRole, role_name='系统管理员', remark='系统所有权限管理员',group_id=DefaultGroup)
session.add(db_role)
db_role_normal = Role(id=DefaultRole, role_name='普通用户', remark='默认用户',group_id=DefaultGroup)
session.add(db_role_normal)
# 给普通用户赋予 构建、知识、模型菜单栏的查看权限
session.add_all([RoleAccess(role_id=DefaultRole, type=AccessType.WEB_MENU.value, third_id='build'),RoleAccess(role_id=DefaultRole, type=AccessType.WEB_MENU.value, third_id='knowledge'),RoleAccess(role_id=DefaultRole, type=AccessType.WEB_MENU.value, third_id='model'),
])
默认用户组
# 添加默认用户组
group = session.exec(select(Group).limit(1)).all()
if not group:group = Group(id=DefaultGroup, group_name='默认用户组', create_user=1, update_user=1)session.add(group)session.commit()session.refresh(group)
管理员用户
user = session.exec(select(User).limit(1)).all()
if not user and settings.admin:md5 = hashlib.md5()md5.update(settings.admin.get('password').encode('utf-8'))user = User(user_id=1,user_name=settings.admin.get('user_name'),password=md5.hexdigest(),)session.add(user)session.commit()session.refresh(user)UserRoleDao.set_admin_user(user.user_id)
预置组件
component_db = session.exec(select(Component).limit(1)).all()
if not component_db:db_components = []json_items = json.loads(read_from_conf('data/component.json'))for item in json_items:for k, v in item.items():db_component = Component(name=k, user_id=1, user_name='admin', data=v)db_components.append(db_component)session.add_all(db_components)session.commit()
系统配置
# 初始化数据库config
init_config()
4. 配置文件初始化
init_config()
会从 initdb_config.yaml
读取系统配置并写入数据库:
def init_config():# 初始化config# 首先通过yaml 获取配置文件所有的keyconfig_content = read_from_conf('initdb_config.yaml')if not config_content:returnwith session_getter() as session:config = session.exec(select(Config)).all()db_keys = {conf.key: conf.value for conf in config}all_config_key = 'initdb_config'# 数据库内没有默认配置,将默认配置写入到数据库if db_keys.get(all_config_key, None) is None:# 将配置文件写入到数据库# 兼容旧配置,需要将旧配置和新的配置文件进行merge, 没有old config直接将新的config添加到数据库new_config_content = merge_old_config(config_content, config, db_keys)try:db_config = Config(key=all_config_key, value=new_config_content)session.add(db_config)session.commit()except Exception as e:logger.exception(e)session.rollback()
总结
你不需要手动执行任何初始化命令! bisheng 后端会在首次启动时自动:
- 创建所有数据库表:基于 SQLModel 模型自动生成表结构
- 填充初始数据:系统角色、权限、用户组、管理员账户等
- 加载预置组件:从 JSON 文件读取预定义的组件配置
- 初始化系统配置:从 YAML 文件读取并写入数据库
使用方式:
- 确保 MySQL 数据库已创建(空数据库即可)
- 配置
config.yaml
中的数据库连接信息 - 启动后端服务:
uvicorn bisheng.main:create_app --factory --host 0.0.0.0 --port 30001
- 系统会自动完成所有初始化工作
这是一个非常完善的自动化初始化系统,大大简化了部署流程!