我们应该如何命名或映射 SQL 个表从 Postgres 到 Node?

How should we name or map SQL tables from Postgres to Node?

我们正在将新项目从 .NET 切换到 Node 和 PostgreSQL。

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

最佳做法是:

  1. 要将查询中的所有列映射到驼峰式命名法? (乏味 - 这就是我们现在正在做的,多行如 "member_id as memberID" 或 "obj.memberID = dbObj.member_id"。)

  2. 要使用下划线分隔的 SQL 列以某种方式自动映射代码中的驼峰式变量?

  3. 只是屈服于 Postgres 命名并让我从数据库查询返回的对象在我的代码中有下划线分隔? (似乎不受欢迎 - 然后我们有带有驼峰式大小写的非 DB 对象和带有下划线分隔的 DB 对象......混乱。)

真的很想使用 SQL 查询而不是 ORM,但到目前为止这是一个症结所在。

你更愿意支持哪一个?像#1 中那样在查询中映射列现在和将来都需要大量工作;通过 humps 或类似方式传递源对象和结果对象来自动化它可以减去很多持续的努力,但这是另一个步骤,另一个地方可能会出错。对#3 的唯一打击是它有点丑。您可以忍受丑陋的东西——关闭任何驼峰式 lint 规则,一段时间后它几乎不会注册。

如果您对外壳一无所知,您确实有一些选择;我知道 Sequelize 支持在驼峰式和 snake_case if you configure your models appropriately, and for a much lower-level take there's an old driver plugin 之间切换。但是,我建议您习惯它。

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

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

Would really like to use SQL queries instead of an ORM, but so far this is a sticking point.

这正是您使用 pg-promise. And even better, you can nicely organize all your SQL within external SQL files, see Query Files and pg-promise-demo 得到的结果。


另请参阅 - 事件 receive

我们决定使用 Knex,它会自动引用所有列名,因此不存在大小写问题。我们在 Postgres 中使用驼峰式命名和 PascalCase 命名,因此数据库与代码一致。

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

编辑:我们现在使用 Objection 的 knexSnakeCaseMappers,它在 Postgres 中自动处理此问题 - 在代码中使用驼峰式命名,在数据库中使用 snake_case。 非常方便。