Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2013, 20:12   #1
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию pqxx программно создать базу данных

Нужно: на локал хосте сначала создать саму базу.
Затем развернуть там все нужные таблицы с наполнением.
Причем сделать это все программно из нативного приложения написанного на с++.

Но есть проблема. Принцип работы с pqxx, как я понял следующий:

Код:
	const std::string str_local = "user='user' password='qwerty' host='localhost' port='5432' dbname='for_test'";
	
	const std::string str_query= "CREATE DATABASE 'for_test' WITH ENCODING 'WIN1251';";
	//-----------------------------------------------------------

	pqxx::connection con(str_local); //<--- бросает исключение
        //pqxx::broken_connection

	pqxx::work query(con, "Sample");

	try 
	{
		pqxx::result res = query.exec(str_query);
	}
	catch (...) 
       {
           std::cout << "Database: failed to execute query: "
                         << str_query << std::endl;
       }
Проблема в том, что база ещё не существует.
Нельзя установить соединение с тем, чего нет.
Для начала нужно создать базу.

Вопрос: как это сделать?


Если создать саму базу в ручную (из терминала или из pqAdmin).
А потом уже программно создавать/заполнять таблицы, то все отлично.

Но хочется полной автоматике.
_Bers вне форума Ответить с цитированием
Старый 14.08.2013, 19:52   #2
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Решение найдено.


Если кому нибудь интересно, то в общих чертах схема следующая:

Что бы пользователь мог развернуть базу на своей локальной машинке, он в любом случае должен будет установить там postgres.

После установки postgres, будет создан локальный сервер, на котором уже будет развернута некоторая служебная база данных, которая называется postgres.
И в системе уже будет существовать одна супер-пользовательская роль, тоже по имени postgres.

Смысл заключается в том, что бы приконнектится к серверу от дефолтного имени postgres (требует админский пароль от машины), к дефолтной базе postgres

После чего уже можно будет создать/развернуть свою базу, и создать роли для пользователей.

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

В коде это выглядит примерно так:


Код:
try
{
//зашли от имени postgres
        const std::string str_local = "user='postgres' password='111' host='localhost' port='5432' dbname='postgres'";
  pqxx::connection con(str_local);
  pqxx::nontransaction query(con, "Sample");
  pqxx::result res = query.exec(" CREATE USER TestUser WITH PASSWORD 'qwerty'; ");
}
catch(const pqxx::failure& e)
{
  cout<<"problem: "<<e.what()<<endl;
}
Далее, создаем новую БД:

Код:
try 
{
        const std::string str_local = "user='postgres' password='111' host='localhost' port='5432' dbname='postgres'";
        const std::string str_query="CREATE DATABASE for_test ENCODING 'UTF8' TEMPLATE template1;";

       //TEMPLATE template1 - это некий прототип, 
       //который будет использован за образец при создании новой БД

  pqxx::connection con(str_local);


  pqxx::nontransaction query(con, "Sample"); //<--- ключевой момент

        //операция создания базы должна быть "не транкзационной"

  pqxx::result res = query.exec(str_query);

        //дальше код создания таблиц, и их наполнения
}
catch(const pqxx::sql_error& e)
{
  cout<<"problem: "<<e.what()<<endl;
}
Нужно ещё сделать обработку ситуаций аля "пользователь с таким именем уже существует" и тп. Но это мелочи.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно-ли создать базу данных в С++ DeadMan1000 Помощь студентам 1 28.09.2012 10:30
Как создать программно базу данных? cargo29 БД в Delphi 5 20.01.2011 09:14
Создать базу данных west23 Microsoft Office Access 2 11.02.2010 21:20
Создать базу данных u108 Помощь студентам 2 19.01.2010 16:01
Создать базу данных Master of Puppets Microsoft Office Excel 5 10.06.2008 13:34