freqtrade convert-db 详解:交易数据库跨系统迁移命令与源码原理
freqtrade convert-db 详解交易数据库跨系统迁移命令与源码原理【免费下载链接】freqtradeFree, open source crypto trading bot项目地址: https://gitcode.com/GitHub_Trending/fr/freqtrade本篇基于 docs/commands/convert-db.md 与仓库源码完整讲解freqtrade convert-db命令的用途、全部参数含义与默认值、典型迁移操作方式以及底层 migrate_db 实现 究竟迁移了哪些数据表、又如何在 PostgreSQL 上正确处理自增序列。读完之后你可以把机器人运行了很久的 SQLite 交易库完整搬到 PostgreSQL或从一个 PostgreSQL 实例迁到另一个并理解迁移过程每一类数据的落库逻辑与序列重置原理。命令概述convert-db是 freqtrade 提供的数据库迁移子命令。它的作用是把交易数据库从一个系统搬到另一个系统例如 SQLite 迁往 PostgreSQL、PostgreSQL 迁往另一个 PostgreSQL 实例迁移内容包括全部 trades、orders 以及 PairLock 等关联数据。命令在 CLI 中的完整帮助信息如下继承自 docs/commands/convert-db.md 原文usage: freqtrade convert-db [-h] [--db-url PATH] [--db-url-from PATH] options: -h, --help show this help message and exit --db-url PATH Override trades database URL, this is useful in custom deployments (default: sqlite:///tradesv3.sqlite for Live Run mode, sqlite:///tradesv3.dryrun.sqlite for Dry Run). --db-url-from PATH Source db url to use when migrating a database.该子命令在 命令注册代码 中定义帮助文案为 Migrate database to different system执行入口绑定到 start_convert_db 函数。参数详解convert-db只接受两个业务参数外加-h对应 arguments.py 中的ARGS_CONVERT_DB [db_url, db_url_from]参数定义位于 cli_options.py。--db-url目标数据库 URL即迁移完成后机器人将要使用的数据库。它是 freqtrade 全局通用的db_url配置项的命令行覆盖形式。默认值定义在 constants.pyDEFAULT_DB_PROD_URL sqlite:///tradesv3.sqlite DEFAULT_DB_DRYRUN_URL sqlite:///tradesv3.dryrun.sqlite从 configuration.py 的赋值逻辑看dry-run 模式下默认使用tradesv3.dryrun.sqlite实盘模式下默认使用tradesv3.sqlite这也正是帮助文本中default:sqlite:///tradesv3.sqlitefor Live Run mode,sqlite:///tradesv3.dryrun.sqlitefor Dry Run的来源。--db-url-from源数据库 URL即迁移的起点库。这个参数是convert-db专属的用于指明从哪个库读数据。在典型的 SQLite 迁 PostgreSQL 场景中目标库--db-url指定 PostgreSQL 连接串源库--db-url-from指向已有的tradesv3.sqlite文件。源码调用链start_convert_db 做了什么db_commands.py 中的入口函数逻辑非常紧凑def start_convert_db(args: dict[str, Any]) - None: from freqtrade.configuration.config_setup import setup_utils_configuration from freqtrade.persistence import Trade, init_db from freqtrade.persistence.db_migration import migrate_db config setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE) init_db(config[db_url]) session_target Trade.session init_db(config[db_url_from]) logger.info(Starting db migration.) migrate_db(session_target)从源码结构可以读出以下要点以工具模式启动配置setup_utils_configuration(args, RunMode.UTIL_NO_EXCHANGE)说明convert-db属于纯离线工具命令——不连接交易所、不加载策略行情只需要解析出db_url与db_url_from两项配置即可运行。先后两次init_db决定了源与目标的角色先对config[db_url]目标库初始化并立刻通过session_target Trade.session拿到目标库的会话对象随后再次对config[db_url_from]源库初始化。由于init_db会重建默认Trade.session后一次初始化使得默认会话指向源库。单行迁移调用migrate_db(session_target)负责把源库当前默认会话所连的库中的全部数据写入session_target目标库。migrate_db 内部实现哪些数据被迁移真正的数据搬运逻辑在 db_migration.py。该函数按以下五类实体逐类迁移且每类独立commit一次数据类别ORM 模型迁移方式交易含其下的订单Trade/Order遍历Trade.get_trades()对每个 trade 及其trade.orders逐个make_transient后 add 到目标会话交易对锁PairLock遍历PairLock.get_all_locks()逐条写入键值存储_KeyValueStoreModel全表 select 后逐条写入自定义交易数据_CustomData全表 select 后逐条写入钱包历史WalletHistory全表 select 后逐条写入其中make_transient(obj)是关键手法把从源会话读取的对象脱钩使其可以被 add 进目标会话而不会带着旧的身份信息与目标库产生冲突。Trade 迁移时特意连同其orders关系一起搬运因此 orders 表也随交易一并完成迁移。所有数据写入完成后函数会查询五张表各自的max(id)并调用 set_sequence_idsmax_trade_id session_target.scalar(select(func.max(Trade.id))) max_order_id session_target.scalar(select(func.max(Order.id))) # ... 同理查询 pairlock / kv / custom_data / wallet_history set_sequence_ids( session_target.get_bind(), trade_id(max_trade_id or 0) 1, order_id(max_order_id or 0) 1, # ... 各表 max(id) 1 )这段处理只在目标库是 PostgreSQL 时生效——set_sequence_ids内部以engine.name postgresql为条件对各序列执行ALTER SEQUENCE ... RESTART WITH max_id 1涉及trades_id_seq、orders_id_seq、pairlocks_id_seq、KeyValueStore_id_seq、trade_custom_data_id_seq、wallet_history_id_seq六个序列。从源码结构看这正是跨库迁移最容易踩的坑PostgreSQL 的自增序列不会因导入数据而自动推进若不重置新插入的行会与源库已有的主键冲突而 SQLite 的自增由rowid/sqlite_sequence维护则不需要此步骤。整个迁移结束后日志会输出形如Migrated {n} Trades, {n} Pairlocks, {n} Key-Value pairs, {n} Custom Data entries, and {n} Wallet History entries.的汇总信息可据此核对迁移条数与源库是否一致。使用示例典型的SQLite 迁往 PostgreSQL操作方式是freqtrade convert-db \ --db-url postgresql://user:passhost:5432/freqtrade \ --db-url-from sqlite:///tradesv3.sqlite反向迁移PostgreSQL 迁回 SQLite 或迁往另一个 PostgreSQL同样适用只需交换两个 URL 的角色。命令运行后会以 INFO 级别输出Starting db migration.与最终的迁移条数汇总。注意事项与适用边界目标库必须是空库官方在 utils.md 中明确警告——请确保只在空的目标数据库上使用此命令因为 freqtrade 执行的是常规迁移若目标库中已存在数据可能会失败。不依赖交易所凭据从RunMode.UTIL_NO_EXCHANGE的启动方式看该命令属于离线工具不需要交易所 API key可在无网络环境下对数据库文件直接操作。迁移范围与 utils.md 的表述trades、orders 与 PairLocks一致源码实际还覆盖 KeyValueStore、CustomData 与 WalletHistory 三类表因此这是一次覆盖持久层全部业务表的完整迁移而不仅是交易记录。适用前提两个数据库的表结构需兼容同一版本 freqtrade 建表。数据库版本升级场景的表结构变更走的是启动时自动 schema 迁移机制而非本命令跨系统迁移时建议保持迁移前后 freqtrade 版本一致。【免费下载链接】freqtradeFree, open source crypto trading bot项目地址: https://gitcode.com/GitHub_Trending/fr/freqtrade创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考