2017-04-05 16 views
2

我们正在切换从.NET到Node和PostgreSQL的新项目。我们应该如何命名或映射Postgres中的SQL表到Node?

由于Postgres的最佳实践似乎不依赖大写,所以我们将数据库列命名为with_underscores_to_separate_words,而不是像MSSQL和Linq那样使用UsingPascalCase。

会最佳实践是:

  1. 要在查询所有列驼峰地图? (单调乏味 - 这就是我们现在所做的,有多行,如“member_id as memberID”或“obj.memberID = dbObj.member_id”。)

  2. 要自动映射代码中的camelCase变量,用下划线分隔SQL列?

  3. 只是放弃Postgres的命名,并从数据库查询返回我的对象​​在我的代码中有下划线分隔? (似乎不可取 - 那么我们有非DB对象与骆驼和DB用下划线分离的对象......凌乱。)

真的想使用SQL查询,而不是一个ORM的,但到目前为止,这是一个棘手的问题。

回答

1

我们决定与Knex一起自动引用所有列名,所以没有套管问题。我们使用camelCase和PascalCase命名Postgres,因此数据库与代码一致。

缺点是,当针对Postgres运行原始查询时,我们需要引用列名,这是我们可以接受的。

1

您希望支持哪一个?在#1中映射查询中的列现在和将来都是很多工作;通过传递源代码和结果对象通过humps或类似的东西来实现自动化可以减少许多不断的努力,但这是另一步,另一个地方可能会出错。反对#3的唯一打击是它有点难看。你可以忍受丑陋 - 关掉任何camelCase lint规则,一段时间后它几乎不会注册。

如果你死在套管上,你确实有一些选择;我知道Sequelize支持camelCase和snake_case if you configure your models appropriately之间的切换,而对于低级别的则需要一个旧的driver plugin。然而,我会建议你习惯它。

+0

谢谢@dmfay - 通过“习惯它”你指的是什么?即“标准”案例可能会是什么 - 全面使用snake_case? –

+0

我的意思是习惯在JavaScript代码中看到snake_cased列名。 – dmfay

1

我相信这涵盖了所有要点:pg-promise and case sensitivity in column names

这是最简单的解决方案 - 对所有列名使用下划线语法,然后自动将它们转换为骆驼案例,如示例所示。

确实想使用SQL查询而不是ORM,但到目前为止这是一个棘手的问题。

而这正是你用pg-promise得到的结果。更好的是,您可以很好地组织外部SQL文件中的所有SQL,请参阅Query Filespg-promise-demo


另请参阅 - 事件receive

相关问题