sqlite(和sql)相当新。我需要使用多个列名生成几个表,这些表可以随着代码的变化而变化(在c ++中)。我该如何管理它们?我做得对吗?必须有更好的实用程序代码。
编辑:具体来说,我想通过在编译时对表和字段名称进行抽象来避免运行时错误(例如,使用#defines,但也许其他更好的东西)。
E.g。我正在考虑创建一个类TableHandler:
sqlite *db;
....
TableHandler tb("TableName");
tb.addField("FirstName", "TEXT");
tb.addField("Id", "INTEGER");
tb.createTable(db); //calls sqlite3_exec("create table TableName(FirstName TEXT, Id INTEGER)");
tb.setEntry("FirstName", "bob");
tb.addEntry(); //calls sqlite3_exec("insert ...");
tb.createCode(stdout);
//this will generate
/*
#define kTableName "TableName"
#define kFirstName "FirstName"
#define kId "Id"
...anything else useful?
*/
答案 0 :(得分:1)
我问了一个类似的问题而且它被投了票,所以我删除了它。如果你有兴趣,我写了一些代码来做插入。但我同意负面评论,即静态SQL语句不易出错。更不用说减少cpu密集了。
对于插入,我获得了std::set
std::pair
std::string
。第一个字符串是列名,第二个字符串是其值。 Query返回了类似的结构。我使用std::map
和std::vector
以及std::unordered_set
进行游戏,所有这些都会带来不同的好处。
如果你能解决这个问题,那将是一个很小的实用程序,它可以读取类的定义并为你编写所有的SQL。我开始这个并放弃了,因为解析C ++头文件变得复杂,我将在未来的项目中节省时间。
<强>加强>
std::string Insert(std::string table, std::vector< std::pair<std::string,std::string> > row)
{
if (row.size()==0 || table.size()==0)
return "";
std::stringstream name,value;
auto it = row.begin();
name << "INSERT INTO " << table.c_str()<<"('" << (*it).first << "'";
value << "VALUES('" <<(*it).second << "'";
for ( ; it < row.end(); it++)
{
name << ", '" << (*it).first << "'";
value << ", '" <<(*it).second << "'";
}
name << ") ";
value << ");";
name << value.str();
return name.str();
}