在当前的项目中,我们需要为不同的数据库提供一些高级别的DBI。它应提供以下特点:
boost::multi_index由于我们需要提供如下功能:定义表布局、做选择、做插入、做更新、连接、.,接口将变得非常复杂。
我们需要一种调用接口函数的好方法。
有许多样式,但我们找不到任何有用的我们的使用。
这里有几个例子:
SOCI
sql << "select name, salary from persons where id = " << id, into(name), into(salary);我们不需要一些SQL语句,所以我们必须以不同的方式定义what和from。
pqxx
Conn.prepare("select_salary",
"select name, salary from persons where id = $1")
((string)"integer",prepare::treat_direct);重载的operator()的大量使用是丑陋的,但它也可能对我们有用。
如何设计界面有什么建议吗?
发布于 2011-07-05 08:54:30
使用对象关系映射如何?下面是一些我头上的代码片段想法--我只在Python中这样做过,从来没有用过C++,而且只针对相当简单的数据库。有一个维基百科的框架列表应该避免过多的车轮相关的研发。
class people: public dbi_table
{
// id column handled by dbi_table.
name: string_column;
salary: money_column;
};
class cost_center: public dbi_table
{
name: string_column;
office: foreign_key<offices>;
};
class people_cost_center_link: public link_table
{
// Many-many relationships.
};然后,您可以将记录作为对象进行操作,所有关系内容都由框架处理。查询是通过定义一个查询对象,然后获得一个迭代器来完成的(参见ODB维基百科页面 )。
发布于 2011-07-05 18:41:13
我会这样做(从c++的角度来看,如果它是正确的数据库内容,它会很好,不知道):
struct Handle { int id; }
class DBI
{
public:
virtual Handle select(int column_id)=0;
virtual Handle select(int column1, int column2)=0;
virtual Handle id(int id)=0;
virtual Handle join(Handle i1, Handle i2)=0;
virtual void execute_query(Handle i)=0;
};通常,这些功能的实现方式如下:
Handle select(int column_id) {
return new_handle(new SelectNode(column_id));
}其中new_handle函数只需将SelectNode插入std::SelectNode或std::map并为其创建句柄。
https://stackoverflow.com/questions/6552660
复制相似问题