sqlalchemy的测试/原型工具

fast-alchem的Python项目详细描述


目的

快速炼金术是一个易于使用的原型/测试工具,能够根据yaml输入文件动态创建sqlalchemy模型和实例。它能够在运行时安全地加载和卸载模型,允许一个多功能和灵活的工作流。

用例包括但不限于:

  • 对ORM模型可能更改的应用程序进行原型设计
  • 构建许多不同的基于模型的测试用例,而不必将测试文件与只使用一次的sqla模型混在一起

一般的原则是,该工具应该简单易用,用于构建简单的用例,同时仍然允许复杂场景的可能性。这就是为什么代码是以一种对现有代码没有侵入性的方式构建的。

是什么使这个库与众不同

使用yaml和sqla填充数据库并不奇怪,但到目前为止,快速炼金术似乎是少数几个能够在运行时创建模型的基础上提供数据库填充的库之一。

定义模型

在开始填充数据库之前,我们需要一个数据库结构。因此,让我们从定义一个模型开始,以设置我们的道路。

请注意,模型将在我们开始时被解释,这意味着您对其他实例或类所做的每个引用都必须在引用行之前的行上定义。这方面的一个例外是back refs,因为它们是一个鸡和蛋的难题。

Formicarium:ref:namedefinition:name:Stringwidth:Integercollection:relationship|AntCollectioncolonies:Backref|AntColony

似乎很简单,但我们还是要逐行讨论一下。

定义型号名称

Formicarium:

所有根键都将被视为模型,在本例中,我们表示需要一个名为formicarium

的sqla模型。

为了简单起见,所有快速炼金术sqla模型都将被赋予一个id列作为主键。

在yaml文件中定义引用实例的方法

ref:name

在某种程度上,如果我们能在我们的模型之间建立关系就好了。由于我们无法控制或查询此yaml定义中的id,因此选择允许将列标记为引用单个实例的方式,以防我们希望通过关系链接两个实例。

在这里,我们选择名称列作为参考值。

定义列和列类型

definition:name:String

definition关键字指示要在其中定义实际模型的块。这里的规则非常简单:定义要给列命名,然后给它一个类型。这些类型是sqlalchemy的通用类型(https://docs.sqlalchemy.org/en/13/core/type_basics.html),应该按照定义的类编写。在本例中,我们定义了一个名为name的列,并为它指定字符串类型

定义关系

collection:relationship|AntCollection

好吧,我们走到了这一步。让我们更进一步,给自己定义一种关系。使用与sqlalchemy相同的术语,我们可以使用关键字定义关系…好。。。关系。我们通过引用之前在yaml中定义的模型来指示模型,我们希望与之建立关系。在引擎盖下,我们将使用其id作为外键,创建与antcollection的多对一关系。

colonies:Backref|AntColony

我们还可以指出,我们有兴趣为将在yaml定义中进一步定义的关系创建back ref。如前所述,如果我们认为快速炼金术是基于解释的,那么这是唯一一个可以引用尚未定义的模型的情况。

定义实例

酷,酷,太棒了。现在我们知道如何创建模型,并且可以开始生成一些实例。

因为这个库的主要目标是快速运行,两个模型定义实例创建可以在同一个文件中完成,但是如果您是一个整洁的怪物,您可以在单独的文件中定义每个实例并单独运行它们。稍后您将在自述文件中找到如何执行此操作。

AntCollection:ref:namedefinition:name:Stringlocation:Stringformicaria:Backref|Formicariuminstances:-name:Anticslocation:My bedroomFormicarium:ref:namedefinition:name:Stringwidth:Integercollection:relationship|AntCollectioncolonies:Backref|AntColonyinstances:-name:PAntscollection:Anticswidth:3AntColony:ref:namedefinition:name:Stringlatin_name:Stringqueen_size:Floatworker_size:Floatcolor:Stringformicarium:relationship|Formicariuminstances:-name:Argentine Antlatin_name:Linepithema humilequeen_size:1.6worker_size:1.6color:brownformicarium:PAnts-name:Black House Antlatin_name:Ochetellusqueen_size:2.5worker_size:2.5color:blackformicarium:PAnts

如你所见,非常直截了当。instances键包含键/值对的列表,您可以在其中填充在模型中定义的每一列。可以使用为相关模型定义的引用列填充关系列。在上面的示例中,所有型号都使用名称列作为其参考列。

请记住,在这里,文件也是以解释性的思维来阅读和评估的。这意味着,如果引用实例,则需要在文件的前面定义它们。

组合键引用

如果您的列都不应该是唯一的,您可以通过逗号分隔要用作引用键的列来组成唯一的引用。

ref:name,width

在实例创建端,您可以按如下方式引用关系:

Formicarium:ref:name,widthdefinition:name:Stringwidth:Integerinstances:-name:PedAnticwidth:10-name:PedAnticwidt:15AntColony:ref:namedefinition:name:Stringformicarium:relationship|Formicariuminstances:-name:ArgentineAntformicarium:PedAntic,10

与代码中加载的模型交互

当快速炼金术加载模型时,模型类被添加到创建它们的快速炼金术实例中。加载完成后,可以作为快速炼金术实例的属性访问模型类

Formicarium:ref:namedefinition:name:Stringwidth:Integercollection:relationship|AntCollectioncolonies:Backref|AntColony
0

多态性

山药定义

由于子分类是面向对象编程的一个自然组成部分,如果它不支持多态性,那么它将是库中的一个巨大漏洞。定义多态模型和子分类一样简单。首先定义父模型并指示多态鉴别器。之后,您可以通过将父模型附加到模型名称定义中来指示子模型从父模型继承。根据模型名称自动生成多态标识

Formicarium:ref:namedefinition:name:Stringwidth:Integercollection:relationship|AntCollectioncolonies:Backref|AntColony
1

装载和卸载型号

作为一个有用的测试工具的一部分,就是在你奇妙的大脑所能想到的许多测试案例中具有多用途的能力。这就是为什么快速炼金术有一个内置的能力来加载模型,然后卸载后,你的测试,显然,通过。这允许您为每个测试加载不同的模型和实例。

我知道我已经说服了你,所以让我们继续表演吧

手动清理

Formicarium:ref:namedefinition:name:Stringwidth:Integercollection:relationship|AntCollectioncolonies:Backref|AntColony
2

使用快速炼金术的上下文管理器

Formicarium:ref:namedefinition:name:Stringwidth:Integercollection:relationship|AntCollectioncolonies:Backref|AntColony
3

组合不同的文件

Formicarium:ref:namedefinition:name:Stringwidth:Integercollection:relationship|AntCollectioncolonies:Backref|AntColony
4

删除特定型号

Formicarium:ref:namedefinition:name:Stringwidth:Integercollection:relationship|AntCollectioncolonies:Backref|AntColony
5

分别加载模型和实例

Formicarium:ref:namedefinition:name:Stringwidth:Integercollection:relationship|AntCollectioncolonies:Backref|AntColony
6

加载预定义模型的实例

快速炼金术能够扫描链接到特定声明基的已定义模型,并使用它们填充数据库

Formicarium:ref:namedefinition:name:Stringwidth:Integercollection:relationship|AntCollectioncolonies:Backref|AntColony
7

结合复杂案例和快速炼金术的简单性

Formicarium:ref:namedefinition:name:Stringwidth:Integercollection:relationship|AntCollectioncolonies:Backref|AntColony
8

原型制作助手

在某种程度上,当你摆弄和发挥到你满意的程度时,你的原型将开始看起来很好,你希望过渡到一个更健壮的实现。使代码更健壮的一部分是…有真实的模型。但是,将yaml文件转换为实际的sqla模型是非常痛苦的。这就是为什么快速炼金术能够将您的yaml模型导出到一个完全可导入的python文件中,其中包含所有最新的模型。

Formicarium:ref:namedefinition:name:Stringwidth:Integercollection:relationship|AntCollectioncolonies:Backref|AntColony
9

生成以下导出文件

Formicarium:
0

烧瓶sqlalchemy集成

不用担心,如果你正在开发烧瓶应用程序,你仍然可以使用快速炼金术。库的行为完全相同,但您可以导入flaskfastalchemy而不是导入fastalchemy来加载模型。

Formicarium:
1

结论

我写自述文件的时间比写代码的时间长。

Worth?也许吧。。。可能。。。我们拭目以待。

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

推荐PyPI第三方库


热门话题
java如何将jaxb插件扩展与gradlejaxbplugin一起使用   java Hibernate列表<Object[]>到特定对象   java使用多态性显示arraylist的输出   java水平堆叠卡,带有一定偏移量   java错误:找不到符号方法liesInt()   java客户机/服务器文件收发中的多线程流管理   在java中可以基于访问重载方法吗?   包含空元素的java排序数组   swing Java按钮/网格布局   java BottomNavigationView getmaxitemcount   java空指针异常字符串生成器   java Xamarin升级导致“类文件版本错误52.0,应为50.0”错误   java我正在尝试打印它,而不只是对每一行进行println   Tomcat7中的java是否需要复制上下文。将xml转换为conf/Catalina/locahost以使其生效   带有注入服务的java REST端点在何处引发自定义WebServiceException?   在Java中使用GPS数据   java如何将JFreeChart ChartPanel导出到包含添加的CrosshairOverlay的图像对象?   内置Eclipse期间的Java 8堆栈溢出   java在GWT编译的JavaScript中如何表示BigDecimal