当前位置: 首页 > news >正文

bisheng 后端初始化数据(main.py > init_data.py)

bisheng 后端确实有数据库初始化机制。让我搜索一下相关的初始化代码和命令。

[6 tools called]

是的!bisheng 后端确实有完整的数据库初始化机制。让我详细解释一下:

数据库初始化流程

1. 自动初始化触发

当应用启动时,在 main.pylifespan 函数中会自动调用:

@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 后端会在首次启动时自动:

  1. 创建所有数据库表:基于 SQLModel 模型自动生成表结构
  2. 填充初始数据:系统角色、权限、用户组、管理员账户等
  3. 加载预置组件:从 JSON 文件读取预定义的组件配置
  4. 初始化系统配置:从 YAML 文件读取并写入数据库

使用方式

  • 确保 MySQL 数据库已创建(空数据库即可)
  • 配置 config.yaml 中的数据库连接信息
  • 启动后端服务:uvicorn bisheng.main:create_app --factory --host 0.0.0.0 --port 30001
  • 系统会自动完成所有初始化工作

这是一个非常完善的自动化初始化系统,大大简化了部署流程!

http://www.dtcms.com/a/350053.html

相关文章:

  • 25072班8.25日 数据结构作业
  • 04-Maven工具介绍
  • kafka 副本集设置和理解
  • 《Spring Boot 进阶:从零到一打造自定义 @Transactional》 ——支持多数据源、动态传播行为、可插拔回滚策略
  • AI系列 - Claude 与 Qwen 模型自动补全对比:谁更胜一筹?
  • 电力系统稳定性的挑战与智能控制新范式
  • 网络与信息安全有哪些岗位:(8)安全审计员
  • C 语言:第 20 天笔记:typedef(类型重命名规则、应用场景与实战案例)
  • 黑客窃取 EDR 检测未检测到的 Windows 机密和凭证
  • 讲解计网中OSI模型及各层作用
  • 网闸和防火墙各有什么长处?
  • ValueTask 实战指南:解锁 .NET 异步编程的性能秘密
  • maui中配置安卓手机在测试环境连接网络
  • 创建Java集成开发环境
  • 车载诊断架构 --- 基于以太网做software download的疑问汇总
  • [QMT量化交易小白入门]-八十四、LSTM模型对期货市场的秒级Tick数据进行预测
  • 14.examples\01-Micropython-Basics\demo_yield.py 加强版
  • 深入浅出 ArrayList:从基础用法到底层原理的全面解析(中)
  • 深度剖析 Grok2 开源:技术原理与创新洞察
  • 奶茶品牌ESG实践:从绿色供应链到可持续竞争力
  • 离线可用的网络急救方案
  • [RK3568][Android11] Android->默认显示设置->系统->开发者选项(不用连续点击版本号)
  • FunASR基础语音识别工具包
  • 学习Python第13天
  • .NET表格控件Spread .NET v18.0——支持富文本、增强PDF导出
  • 【Linux基础知识系列】第一百零七篇 - 使用crontab设置定期任务
  • 【文献阅读】SparseGPT: Massive Language Models Can be Accurately Pruned in One-Shot
  • 【保姆级】AutoCAD 2026安装包下载及详细图文安装教程!
  • Mysql杂志(一)
  • 大模型中常用的提示词框架