最近在看文档的数据库部分,碰见了很多的数据库类型,干脆把各个数据库的配置记录一下,了解一下vnpy的数据库部分结构。
本文涉及的数据库包括MySQL,SQLite,MongoDB,(PostgreSQL就不写了,和MySQL差不多)。
第一次发长文,排版不好或是认知有偏差敬请指出。本人也算小白,仅当记录自己的心得了。
Vnpy的database
database模块一般用于CsvLoader模块中的数据持久化(导入)和CtaBacktester模块中的数据导出,在这两个模块中,database这个module是以BaseDatabaseManager类对象出现的,并且会直接调用这个类对象的导入导出方法。下面概括下这个类对象是如何生成的。
上图是database简略框架图。
在导入database这个module的时候,可以分成三层结构
- 自动运行init.py文件,读取.vntrader/vt_setting.json中的数据库配置信息(也就是GUI界面点击菜单栏中”配置“出现的那个),然后调用.initialize中的init方法。
- 在settings中保存着数据库driver类型,根据不同的类型又调用同一文件中的init_sql或者init_nosql。以init_sql为例,函数内部从database_sql.py中调用真正的init函数。目前为止并没有实质的内容,只是不断的在分层选择调用不同的函数。
- 接下来以sqlite为例,并且会涉及peewee包。
peewee包的作用我理解是,用统一的形式对sql数据库进行管理,开放上层接口给用户使用。(有误请指出,谢谢)
在peewee中,一个model类对象视为一张表,相应类实例可以视为一条记录(row),一个field实例可以视为一列。先使用peewee提供的数据库引擎类实例化,建立与数据文件的连接,然后定义一个model类用于表示表,最后将model类添加到数据库引擎类(即生成数据表)。此时,db即可表示一个与数据文件连接着的数据引擎实例,上面添加到db的model类即可以表示db中的一张张表,可以取出来继续单独使用(原理是在定义model类时,使用了class meta吧我猜)
那么在database_sql.py中,整个逻辑过程就是:在init中调用peewee的Database Engine(SQLiteDatabase)生成实例表示与db文件建立连接,将该实例对象称为db。调用init_models函数生成model类同时将model类添加到db中,然后将两张表返回(DbTickData和DBBarData)。最后,将这两张表(类)添加到SqlManager中,生成统一的BaseDatabaseManager,并提供给外界调用。
大概逻辑图长这样:
数据库配置
上面大致介绍了BaseDataManager的生成过程,现在介绍不同数据库具体使用时候setting如何填写。
- #### Sqlite
额外注:在内部运行过程中,其实只用到了database.database这条配置,它的值也就是数据库文件的名字。其余都没有用到(不需要)Sqlite是vnpy默认的数据库,配置不用特意去改,同时,Sqlite的数据库文件在.vntrader\\vt_setting.json中(以"database."为前缀的那几个)。
- #### MySQL
peewee在连接本地mysql数据库时,实际调用的是MySQLdb或者是pymysql包。实际必须的只有数据库名称,用户和密码,后面两个都是默认有的(pymysql)MySQL使用到的配置信息包括:database,user,password,host,port。
使用MySQL除此之外还需特别注意,peewee不能为本地创建不存在的database,这意味着需要使用vnpy+MySQL的用户需要自己额外创建一个database,假如是”vnpyDb”,那么在配置栏就写vnpyDb"。 - #### MongoDB
后续补上,写太长了