ArangoDB迁移和批处理管理器

migrado的Python项目详细描述


偏头痛

pypi package构建状态<

ArangoDB迁移和批处理管理器。

migrado是一个命令行客户机,它可以帮助构建和运行针对您的arangodb实例的模式或数据迁移。

migrado在运行数据迁移时利用arangodb事务来确保自动回滚失败的脚本。运行架构迁移需要docker,但此时没有事务安全性。

migrado应被视为alpha软件。在生产环境中使用之前,请确保测试良好。

如果你有困难,就提出一个问题。欢迎投稿。

安装

Migrado需要Python3.5或更高版本。

$ pip install --user migrado

用法

migrado可以创建一个迁移目录,并从给定的模式文件生成一组初始集合:

$ migrado init --schema schema.yml

有关详细信息,请参见yaml schemas。如果没有指定模式,migrado将创建一个空的初始迁移。

制作新的模板迁移脚本:

$ migrado make --name rewrite_names

这将创建一个新文件migrations/0002_rewrite_names.js--name是可选的),您可以根据需要对其进行编辑。有关详细信息,请参见迁移脚本。

准备就绪后,运行当前未对数据库运行的所有迁移:

$ migrado run

migrado将迁移状态存储在一个可配置的集合中,有关详细信息,请参见--helpenvironment vars

如果您编写了reverse()迁移,则可以通过指定目标迁移ID还原到较早的点。若要还原到初始迁移:

$ migrado run --target 0001

在使用客户端时,使用--help选项可获得有关任何命令的帮助。

环境变量

migrado使用以下环境变量:

  • migrado_path:指定迁移目录的路径,替换-p--path(默认值:迁移)。
  • migrado-db:指定要与之交互的生成迁移的arangodb数据库名称,替换-d--db(无默认值,但对于run命令是必需的)。
  • migrado_coll:指定要存储迁移状态的arangodb集合名称,替换-c--state coll(默认值:migrado)。
  • migrado_tls:运行迁移时使用tls进行连接,替换-t--tls(默认值:false)。
  • migrado_host:指定运行迁移的数据库主机,替换-h--host(默认值:localhost)。
  • migrado_port:指定运行迁移的数据库端口,替换-p--port(默认值:8529)。
  • migrado_user:指定运行迁移的数据库用户名,替换-u--用户名(无默认值)。
  • migrado_pass:指定运行迁移的数据库密码,替换-w--password(无默认值)。
  • migrado_docker_image:指定docker映像(和可选标记)对于运行迁移的容器,替换-i--docker image(默认值:arangodb)。
  • migrado_docker_network:指定运行迁移的docker网络模式或名称,替换-n--docker network。有效值为主机(默认情况下,使用主机网络)或任何网络名称。
  • migrado_docker_service:指定运行迁移时要连接的docker服务,替换-s--docker service(默认值:与migrado_host相同的值)。

如果您的ArangoDB实例本身正在Docker上运行,那么可以配置Migrado_Docker_NetworkMigrado_Docker_Service以便创建的容器可以轻松连接到正确的网络和服务。

对于与Docker守护进程的连接,可以接受其他环境变量;Docker_hostDocker_tls_verifyDocker_cert_path。它们与Docker命令行客户端使用的相同。

yaml模式

arangodb可能是无模式的,但是在一个更大的项目中,保持模式规范是最新的仍然是有意义的,既可以用于集合及其数据结构的概述,也可以作为验证的基础。

migrado在yaml中使用基于json模式的模式模型,并可以使用此模型为数据库中可用的集合生成初始迁移。

示例架构:

---all:&all_id:type:stringreadOnly:true_key:type:stringreadOnly:true_rev:type:stringreadOnly:trueedges:&edges_from:type:string_to:type:stringcollections:books:type:objectproperties:<<:*alltitle:type:stringisbn:type:stringrequired:-title-isbnauthors:# Note, you do not actually need to specify the object schema,# but they can be used in API specs (e.g. OpenAPI) and/or validation,# and may be handled by migrado in the future.edge_collections:# authors --> books author_of:type:objectproperties:<<:*all<<:*edgesrequired:-_from-_to

迁移脚本

迁移脚本是结构化的,因此migrado和arangodb都可以轻松地解析和运行它们。此外,它们是结构化的,因此可以使用arangosh对arangob手动运行它们。

有两种脚本,数据架构迁移脚本。

数据迁移

您需要使用语法//write collection_name声明要执行写操作的所有集合,因为arangob在事务期间需要此信息进行锁定。我们已明确声明以减少错误。试图写入未以这种方式声明的集合将导致迁移失败。

一般来说,反向迁移应该做与正向迁移相反的逻辑操作。forward()reverse()函数可以包含ArangoDB V8引擎可以理解的任何内容,但必须完全独立。运行迁移时,这些功能之外的任何内容都将被忽略并且不可用。

下面是一个迁移脚本示例,用于在集合中添加新字段

// write thingsfunctionforward(){vardb=require("@arangodb").dbdb._query(`        FOR thing IN things            UPDATE thing WITH { new_field: "some value" } IN things    `)}functionreverse(){vardb=require("@arangodb").dbdb._query(`        FOR thing IN things            REPLACE thing WITH UNSET(thing, "new_field") IN things    `)}

运行ArangoDB文档中的事务时,请确保阅读限制。尤其是,事务中不允许创建和删除数据库、集合和索引。

如果迁移包含此类操作,系统将询问您是否要通过Docker运行迁移。

架构迁移

架构迁移的结构与数据迁移相同,但在容器中针对arangosh运行,该容器来自官方arangob docker image。运行架构迁移时没有事务安全性。

架构迁移的结构与数据迁移相同,但不需要声明。允许所有操作。

下面是从上面的yaml模式生成的迁移脚本示例:

functionforward(){vardb=require("@arangodb").dbdb._createDocumentCollection("books")db._createDocumentCollection("authors")db._createEdgeCollection("author_of")}functionreverse(){vardb=require("@arangodb").dbdb._drop("books")db._drop("authors")db._drop("author_of")}

反向运行架构迁移时请小心。如您所见,上面的reverse()函数将删除您的集合,如果您要在这一点之后反转。目前,对于初始迁移,您将无法执行此操作。

< h2>to/< H2>
  • []类似事务的架构迁移安全运行
  • []模式迁移的自动扩散
  • []使用migrado添加索引
  • []使用migrado添加重复任务

许可证

Migrado版权所有©2019 Protojour AS,由麻省理工学院授权。有关详细信息,请参见license.txt。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何将JSP与Hibernate连接?   java无法退出do while循环,即使表达式为false   使用Restlet和GAE过滤根路径   java<rich:popupanel按钮在JSF项目中不起作用   java错误:在安卓包中找不到属性“showAsAction”的资源标识符   性能Java 2D:在屏幕上快速渲染大量瓷砖   java Android MediaPlayer seekTo(0)不寻求启动   java使用jsweet将小程序代码转换为js。类文件依赖关系   java Maven导入问题,在complie时间使用里程碑版本,但在运行时使用最新版本   java JPA:从另一个对象访问对象返回null   java我如何启动一个java应用程序。带有桌面快捷方式的jar文件(针对特定jre)   java将值从JTextField传递到方法的最佳方式?   在java中从字符串中分离子字符串   java如何初始化使用另一个映射作为值的EnumMap   单击<a>元素时java JSF调用bean方法   java Board的方块不会出现。   java如何在spring boot中部分回滚数据,错误将被分散   java从另一个类文件向类添加方法   如何修复错误“TimeBackUp.java使用未经检查或不安全的操作”?