Оператор С++ ‹‹ в базу данных и из базы данных

Я хочу использовать оператор << и >> для загрузки и сохранения во внешнюю базу данных. Что должна реализовать внешняя база данных, чтобы это работало?

Мысли или опыт? Я использую SQL для взаимодействия с моей базой данных sqlite3.

Например, я хочу сказать:

MyClass c;
c >> databaseInstance;
c << databaseInstance;

person reza    schedule 26.11.2012    source источник
comment
Что ж, оператор ‹‹ хочет работать с потоками. Я вижу, что базы данных, вероятно, КАК-ТО МОГЛИ быть представлены как потоки... Но чего бы вы хотели добиться, ПРОЧИТАЯ из экземпляра базы данных? Что должна читать БД?   -  person sinni800    schedule 26.11.2012
comment
это очень странная абстракция. ›› и ‹‹ работают с потокоподобными вещами. База данных не похожа на поток. Это больше похоже на словарь   -  person pm100    schedule 26.11.2012
comment
Нет, не знаешь. перегрузка операторов — это то, что делает ваш код более кратким и ясным. Если бы я увидел эти операторы, используемые с БД, это показалось бы кратким и непрозрачным.   -  person Tony Hopkinson    schedule 26.11.2012


Ответы (2)


databaseInstance должен иметь какой-то тип, предоставляющий функции operator>> и operator<<, которые записывают в базу данных так, как вы хотите, таким образом предоставляя потоковый интерфейс. Эти функции будут определены примерно так:

database_type& operator<<(database_type& databaseInstance, MyClass& c)
{
  // Write to database here
  return databaseInstance;
}

database_type& operator>>(database_type& databaseInstance, MyClass& c)
{
  // Read from database here
  return databaseInstance;
}

При этом используется перегрузка оператора. Больше нечего сказать, и это довольно странная вещь, связанная с базой данных, поскольку база данных не очень похожа на поток.

Вы, вероятно, захотите изменить использование операторов для обеспечения согласованности со стандартной библиотекой C++:

MyClass c;
databaseInstance << c;
databaseInstance >> c;

Однако неясно, что именно последняя строка будет читать в вашем объекте MyClass. Вторая строка действительно имеет смысл только в том случае, если этот databaseInstance настроен для вставки в конкретную таблицу.

person Joseph Mansfield    schedule 26.11.2012
comment
Именно то, что я думал. У экземпляра базы данных есть так много вещей, которые он может вернуть, что в этом нет смысла. Также: в какую таблицу, базу данных и т. д. он должен вставляться в первом случае? Я предполагаю, что это могло узнать, отражая фактический объект, но тем не менее. - person sinni800; 26.11.2012
comment
@MooingDuck Надеюсь, тебе лучше. :D - person Joseph Mansfield; 26.11.2012

Хм. интересно..

Хорошо, я предполагаю, что вы просто хотите выбрать из БД в случае оператора>> и вставить/обновить в случае оператора‹‹. Хитрость здесь заключается в том, чтобы знать, в какие столбцы читать/писать.

Вы можете использовать манипулятор потока (например, "hex", который преобразует целочисленный вывод в шестнадцатеричный формат), чтобы определить, какой столбец использовать, поэтому у вас будет что-то вроде

int c;
DBStreamInterface db(tableA);
c << columnA << db;

или вы можете определить тип структуры, который имеет тот же макет, что и таблица, и считать в него всю строку:

struct TableRow {
  int columnA;
  string columnB;
};
TableRow t << db;

но вам нужно быть осторожным с сопоставлением схемы в БД с определением структуры (если вы не хотите изо всех сил генерировать код шаблона, где вы можете создать соответствующую структуру, прочитав схему DDL и динамически выделяя хранилище для каждого поля в конструкторе класса).

person gbjbaanb    schedule 26.11.2012