【问题标题】:Node.js MySQL create Table dynamicallyNode.js MySQL 动态创建表
【发布时间】:2019-02-21 09:12:41
【问题描述】:

我在创建包含动态列数的表时遇到问题。

我有一个对象,我不知道确切的键数量

var obj = {
  data_1: 123,
  data_2: 456,
  data_3: 789,
  (...)
};

此对象的每个键都应成为新表中的一列。 幸运的是,列数据类型始终是双精度。

我需要这样的东西:

"CREATE TABLE 'Data' (  
   FOREIGN KEY (id) REFERENCES other_table(id), // this is fixed
   data_0 int, // this is fixed
   Object.keys(obj) double
)"

这甚至可能吗?我找不到任何类似的东西。

如果有人能帮我解决这个问题,我会很高兴。

【问题讨论】:

  • 将其作为 JSON 对象保存到数据库中?
  • 这是唯一的可能吗?我宁愿为每个值设置一列。
  • 你确定所有对象都有完全相同的键吗?如果是,您可以使用 Object.keys(data).map(k=>k+" int,\n") 以外的内容生成 create table 的那部分。
  • 如果不知道确切的用例以及如何处理数据的所有边缘情况,就无法真正回答这个问题。一般来说,如果您不知道data_ 条目的数量,并且您需要能够查询为data_ 存储的数据,那么您需要有一个表格other_table(id), key, value 和每个data_是表中自己的行。如果您有每个条目的最大键数,那么您可以考虑列而不是 NULL。
  • @bitifet 这很完美。谢谢!实际上并不知道您可以使用 map 在 sql 语句中“循环”。如果您可以将其发布为实际答案,我将标记为已接受。我的声明(有效)现在看起来像这样:"CREATE TABLE new_table (ID int, FOREIGN KEY (ID) REFERENCES other_table (ID), data_0 int, "+ Object.keys(obj).map(k=>k+" double")+")"

标签: mysql sql node.js


【解决方案1】:

实际上在cmets中解决了。

但为了完整起见,这里说的更详细:

如果要插入的所有对象都具有相同的键,我们可以从第一个中选择键并使用该数据生成整个 CREATE TABLE 语句。

例子:

const data = require("path/to/some/data");
const sql = [
  "CREATE TABLE new_table (",
  "id int REFERENCES other_table (id),",
  "data_0 int,",
  Object.keys(data[0])
    .map(k=>k+" int")
    .join("\n")
  ,
  ")",
].join("\n");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多