我编写了一个有效的语法来替换 scala 中的 dbunit,称为 ScalaDBTest。整个程序有效 - 只花了 2 天的时间来编写。我有很多抛光工作要做。
无论如何,我用于 DSL 将数据输入数据库的语法是可延展的,我想要一些反馈。
基本语法如下所示。这很简单:
country:
- country_id: 1, name: "Canada"
- country_id: 2, name: "United States"
这肯定比 XML 或 SQL 插入语句好。
我辩论过使用“:”或“=”。前者看起来更好,但后者对我来说似乎是自动输入的。
还有一个概念,您可以在其中“标记”记录。从某种意义上说,上述语法是匿名记录。标签将是一个有趣的功能,因为您可以通过多种方式使用它们。
country:
record: Canada -> country_id: 1, name: $label # produces "Canada"
record: UnitedStates -> country_id: 2, name: $label.uncamel # produces "United States"
我不喜欢这种语法。有点啰嗦两句。使用“-”看起来不对,但如果我使用像“记录”这样的实际命令词,我需要用“->”将它们分开,否则看起来很糟糕(出于技术原因,这不是必需的)。
$label 将简单地重复标签,因此您可以最少使用标签作为重用字符串的方式。$label.uncamel 会在看起来像驼峰格的地方添加空格。
标签背后的想法是为 API 提供一种无需记住 id 即可访问记录的方法。如果您知道要获取的国家对象是“加拿大”,那么您只需传递标签“加拿大”,它就会将其转换为唯一的 id 并将其从数据库中提取出来。
这是一个可以指定默认参数的示例:
province:
? country_id: 1, nice_weather: true
- province_id: 1, name: "British Columbia"
- province_id: 2, name: "Manitoba", nice_weather: false
- province_id: 3, name: "New York", country_id: 2
这是你看到的一些真正的力量。所有这 3 条“省”记录将有 4 列。由于有 2 个省份来自加拿大,因此它们自动继承自默认值。在第 3 种情况下,我们用 United States for New York 覆盖它。我们可以根据需要混合/匹配。
在实践中,这将节省大量的打字和认知负担,因为我们在实践中通常只关心几个值,其余的可能只是占位符,让数据库因缺少必填字段等而关闭。这也确实有助于测试多态对象。
这是另一个:
article:
? date_create: $now
- article_id: 1, title: "The Fed Sucks"
- article_id: 2, title: null
此代码段显示您实际上可以放置空值,而无需像在 dbUnit 中那样做任何技巧。在 DbUnit 中,您必须首先创建一个将自定义字符串(如“[NULL]”)转换为实际空值的转换器。
事实上,我们可以更具表现力,并提供各种表达式和函数来帮助生成数据。例如,$now 返回格式正确的今天日期/时间的 sql 日期。我将扩展这些功能以帮助更轻松地编写测试数据。
无论如何,我正在寻求帮助来真正清理语法。我可以做出任何改变,因为这是新鲜的,我想从一开始就让它变得非常时髦,而不是以后再改变。
谢谢