gpt4 book ai didi

C++ - 使用迁移的数据库模式

转载 作者:行者123 更新时间:2023-11-30 02:34:48 25 4
gpt4 key购买 nike

我正在开发一个需要使用数据库的应用程序。我们目前正在使用迁移文件,但是,这只是原始 sql,可能会变得非常困惑和困惑,尤其是当每个人都添加到它并保持最新时,这变得更加困难。

我一直在考虑在应用程序中加入迁移类型功能的想法,我们在其中为每个迁移创建一个类,然后定义表和列等。使用 lambda。但是,我想出的似乎没有用。到目前为止,这是一个示例:

class Schema {
public:

Schema() { } // construct

template<typename T>
void static create(std::string name, T t)
{
cout << "Create is started..";
// This is where all the logic will go
}

void static integer(std::string column_name)
{
std::cout << "Column integer is called";
// put SQL here for integer value
}
};

然后迁移文件将像这样工作:

class CreateUserTable {

public:
CreateUserTable() {

Schema::create("users", []()
{
Schema::integer("id");
});
}


};

我的想法是,当我调用这些迁移文件时,它基本上会生成一系列格式良好的 sql 语句,我可以将其用于我的迁移。

问题:

通过使用 Lambdas(按原样),我将如何在创建函数完全执行之前调用列的每个函数调用?

编辑:

基本上,在我调用 lambda 函数的主体时,清除内容:

Schema::integer("COLUM_NAME");

它会给最终的SQL语句增加一层。假设我做了以下事情:

Schema::create("users", []()
{
Schema::integer("id");
Schema::integer("number");
});

它将创建以下字符串:

CREATE TABLE `users` (
id INT NOT NULL AUTO_INCREMENT,
number INT NOT NOW AUTO_INCREMENT

)

但是,通过创建“CreateUserTable”的新对象,唯一输出的是:cout << "Create is started..";而我需要 std::cout << "Column integer is called";在它之前被调用.. 看起来它没有对函数做任何事情?

最佳答案

你只需要调用lambda来实际执行任务

class Schema {
public:

Schema() { } // construct

template<typename T>
void static create(std::string name, T const & t) // pass reference to avoid copy
{
cout << "Create is started..";
t(); // call the lambda to do the actual work
cout << "Create is ended."; // you can run generated sql query now
}

void static integer(std::string column_name)
{
std::cout << "Column integer is called";
// put SQL here for integer value
}
};

请注意,此代码不是线程安全的。如果同时调用多个 Schema::create,您将得到意想不到的结果。您可以将模式构建器对象传递给 lambda 并使用它来构建查询来解决此问题。

关于C++ - 使用迁移的数据库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34321372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com