Russian Qt Forum

Qt => Базы данных => Тема начата: cya-st от Сентябрь 17, 2009, 15:43



Название: CREATE DATABASE
Отправлено: cya-st от Сентябрь 17, 2009, 15:43
Привет всем! Подскажите пожалуйста как создать БД, делаю так:
Код
C++ (Qt)
 
           db=QSqlDatabase::addDatabase("QPSQL");
   db.setHostName( sServerIP );
   db.setPort( MY_DBPORT );
   db.setDatabaseName("postgres");
   db.setUserName( MY_DBUSER );
   db.setPassword( MY_DBPASS );
 
//    db.exec("CREATE DATABASE myDB;"); // тоже не создается
 
           QSqlQuery query(db);
   query.exec("CREATE DATABASE myDb;");
 
Возвращается ошибка: <internal error>


Название: Re: CREATE DATABASE
Отправлено: _OLEGator_ от Сентябрь 17, 2009, 18:40
Код
C++ (Qt)
db.open(); ???


Название: Re: CREATE DATABASE
Отправлено: cya-st от Сентябрь 17, 2009, 19:03
Код
C++ (Qt)
db.open(); ???
Спасибо помогло, как это я мог забыть?


Название: Re: CREATE DATABASE
Отправлено: _OLEGator_ от Сентябрь 17, 2009, 19:50
Бывает, по запарке, обычно все сложное и тяжелое сделаешь, а про мелочи забываешь ;)


Название: Re: CREATE DATABASE
Отправлено: break от Октябрь 18, 2009, 00:57
А так у вас заработало??? Я специально проверил - у меня нет - потому что на мой взгляд то что написано бред. Вы подключаетесь к одной базе и через контекст этой БД хотите создать еще одну??? это невозможно! Я думаю вы всего лишь подключаетесь к существующей БД и ничего не создаете!!!

после вашего оператора query.exec("CREATE DATABASE myDb;"); сделайте так:

   if ( query.lastError().type() != QSqlError::NoError )
   {
      qDebug() << "Error:" << query.lastError().text();
      return false;
   };
и скиньти мне вывод -  не напишет ли он вам - что то типа: Dynamic SQL Error - SQL error code = -104 - Token unknown - line X, column XX - XXX Could not prepare statement

Вы или неправильно задали вопрос - вам надо было подключиться к сущ. БД - тогда этот оператор не нужен query.exec("CREATE DATABASE myDb;"); или же вам нужно использовать усовершенствованный драйвер Qt умеющий создавать базы (насколько я знаю существующие этого не могут) или более простой способ - использовать внешние утилитыы из комплекта БД для создания базы - через QProcess.

В общем мне очень интересно!!!


Название: Re: CREATE DATABASE
Отправлено: cya-st от Октябрь 18, 2009, 16:07
Да давно уже работает, я уже и забыл про это. Просто незабудь поставить db.setDatabaseName("postgres");, ну и конечно пользователя и пароль не забудь указать для этой базы.


Название: Re: CREATE DATABASE
Отправлено: break от Октябрь 18, 2009, 18:02
издеваешься??? Что там работает - БД создается?


Название: Re: CREATE DATABASE
Отправлено: cya-st от Октябрь 18, 2009, 18:21
Я не издеваюсь. Программа рабочая, но еще не доработанная. (Всмысле я ее портирую с дельфи). Правда в установке я выполняю команду:
Код
DOS
C:\PG\bin\psql.exe -d template1 -f c:\pg\cruser.sql
 
Файл cruser.sql:
Код
SQL
CREATE USER "user1" WITH PASSWORD 'pass1' SUPERUSER CREATEDB CREATEROLE;
 
Я так думаю что проблема может быть в том что не создан юзер с вышеперечисленными правами.


Название: Re: CREATE DATABASE
Отправлено: BaltikS от Октябрь 18, 2009, 18:37
всё правильно, если пользователя наделить правами на создание баз, то таким способом можно её создать!


Название: Re: CREATE DATABASE
Отправлено: break от Октябрь 19, 2009, 03:28
Цитировать
всё правильно, если пользователя наделить правами на создание баз, то таким способом можно её создать!

каким способом? - счначала подключившись к ней а потом создав ее через коннект с ней же?????????? мне так и не дали посмотреть на вывод команды которую я просил - уверен 99% автор поста только подулючается к базе через драйвер QT а не создает ее.

вот код автора с учетом что он забыл команду db.open
Код
C++ (Qt)
 db=QSqlDatabase::addDatabase("QPSQL");
   db.setHostName( sServerIP );
   db.setPort( MY_DBPORT );
   db.setDatabaseName("postgres");
   db.setUserName( MY_DBUSER );
   db.setPassword( MY_DBPASS );
                   db.open();
 
// все ниже выполнится с ошибками!!!!!!!!!! и не имеет смысла т.к. если db.open(); вернет true -
// значит БД уже есть и создавать ее не надо, а если false то ее нет и создать ее операторами ниже все равно нельзя!!!
//    db.exec("CREATE DATABASE myDB;"); // тоже не создается
 
//            QSqlQuery query(db);
//    query.exec("CREATE DATABASE myDb;");
 

а создать БД через команду CREATE DATABASE можно конечно - но вероятно в каком нибудь БД Админ кот. использует API базы а не через стандартный драйвер Qt...


Название: Re: CREATE DATABASE
Отправлено: CroCIV от Октябрь 19, 2009, 07:39
Подключение к СУБД и управление БД - это разные вещи. В одной СУБД может быть гипотетически не ограниченное кол-во БД. Для успешного создания БД необходимы права администратора, скорее всего у тебя просто не достаточно прав. Мб еще стоит посмотреть настройки самой СУБД, там тоже могут быть подводные камни, например, на MS SQL 2009 есть галки: запретить подключение через ОДБЦ, запретить вход администратора через ОДБЦ, и по молчанию они включены, так вот, пока ты их не вырубишь к СУБД из Qt посредством ODBC цепануться сложно )). Разбирайся со своим сервером.

З.Ы.: прав тот у кого больше прав


Название: Re: CREATE DATABASE
Отправлено: BaltikS от Октябрь 19, 2009, 08:07
break, Всё создаётся без  PgAdmin... Вот не поленился и выдрал код
Код
C++ (Qt)
QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
db.setDatabaseName("template1");
db.setPort(5432);
db.setHostName("myhost");
if (!db.open(ui.e_user->text(), ui.e_password->text()))
{
...
            }
...
QSqlQuery query(db);
if (!query.exec("CREATE DATABASE xxx ENCODING = 'KOI8';"))
{
...
            }
 
Да, единственно, не заметил, подключаться надо к БД template1, а не postgres...
Ну и если мы хотим работать далее с новой базой, то конечно нужно сделать реконект.


Название: Re: CREATE DATABASE
Отправлено: break от Октябрь 19, 2009, 11:35
Цитировать
В одной СУБД может быть гипотетически не ограниченное кол-во БД.

Это чудо философской мысли мне непонятно. Если считаете что фраза порлна смысла раскройте мне ее буду коллег поучать :-)

На счет создания базы - мне кажется способ подключения сначала к ненужной, а потом создание нужной - кривым, хотя я удивлен что так работает. Но мне этот вариант не интересен - например человек установил мою программу которая работает с БД и программа должна при первом запуске создать базу. И к какой временной базе я подключусь? А если таскать временную с собой в дистрибутиве программы, то зачем можно и болванку рабочей таcкать обновив при первом запуске и дав нужное имя. Кстати вас не смущает что вы не указываете в каком месте файловой системы создасться БД? или указвываете - в коде не увидел этого.


Название: Re: CREATE DATABASE
Отправлено: Пантер от Октябрь 19, 2009, 11:45
При чем тут постгрес и указание расположения БД?
А на счет того, что нужно сначала в ненужную приконнектится, а потом уже создать новую базу, большого костыля не вижу. Просто так подсоединится, не указывая конкретную БД, на сколько я знаю, невозможно. А БД postgres создается при инсталлировании самого постгреса. Как вариант, можешь в инсталлятор своей софтины положить psql.exe и запустить его с параметром создания твоей БД.


Название: Re: CREATE DATABASE
Отправлено: cya-st от Октябрь 19, 2009, 11:48
Таскать с собой базу не придется, например в Postgre после выполнения команды:
Код
DOS
c:\pg\bin\initdb.exe -D c:\pg\data
, автоматически создается база postgre.


Название: Re: CREATE DATABASE
Отправлено: BaltikS от Октябрь 19, 2009, 11:58
break, у Вас слабые познания в области Postgres. Если вы её выбрали в качестве основной, то там много чего интересного есть!


Название: Re: CREATE DATABASE
Отправлено: break от Октябрь 19, 2009, 12:04
у меня нет познаний в области Postrgress - я работаю с FB

Цитировать
положить psql.exe и запустить его с параметром создания твоей БД.

Это я в самом первом своем посте предложил - но это не имеет ничего общего с созданием базы через QT

А я считаю что костыль большой, т.к. в QT соединение с БД предназначено для работы с этой бд а не для создания через него других баз.


Название: Re: CREATE DATABASE
Отправлено: CroCIV от Октябрь 19, 2009, 13:45
Цитировать
В одной СУБД может быть гипотетически не ограниченное кол-во БД.
Это чудо философской мысли мне непонятно. Если считаете что фраза порлна смысла раскройте мне ее буду коллег поучать :-)
У одного SQL-сервера может быть несколько баз данных.

На счет создания базы - мне кажется способ подключения сначала к ненужной, а потом создание нужной - кривым, хотя я удивлен что так работает.
К Некоторым серверам SQL можно подцепиться не указывая базу данных явно, некоторые сервера к чему-нибудь тебя сами подцепят, некоторые сервера вообще позволяют выборки делать из разных баз данных. Так, например, в Transact-SQL прокатит такой запрос влегкую select * from [bd1].[owner1].[table1], [bdi].[ownerj].[tablek] where ... .
с постиджем я не работал ни разу только в основном с мускулем и с мелкомягким... какие там нюансы хз, но сильно отличаться не должно.

И к какой временной базе я подключусь?
Это тебя заботить не должно. лишь бы знал какую тебе базу эксплуатировать в итоге нужно.

Кстати вас не смущает что вы не указываете в каком месте файловой системы создасться БД? или указвываете - в коде не увидел этого.
Это тебя вообще ни как не касается, это головная боль администратора SQL-сервера как и резервирование, как и назначение прав юзерам, и другие технические вопросы. Все что тебя должно заботить это знание адреса сервера в сети, порт на котором интересующий SQL-сервер сидит, твой логин с паролем с достаточными правами и название твоей БД. Все остальное не твое, или твое, если ты по совместительству еще и админ сервера.




Название: Re: CREATE DATABASE
Отправлено: CroCIV от Октябрь 19, 2009, 13:53
...с созданием базы через QT
А я считаю что костыль большой, т.к. в QT соединение с БД предназначено для работы с этой бд а не для создания через него других баз.

Как бы стандарт SQL-92 года и все последующие стандарты SQL содержат в себе языковые конструкции по управлению базами данны (не только ими ::) (в широком смысле)) сссно всякий SQL-сервер, если это SQL-сервер, обязан обеспечивать создание баз данных своими SQL конструкциями. Т.е., выходит, не костыль.


Название: Re: CREATE DATABASE
Отправлено: break от Октябрь 19, 2009, 16:46
Цитировать
У одного SQL-сервера может быть несколько баз данных.
Не может быть а я то 5 лет думал что с одним сервером только 1 база работать может - только почему вы мне не про то толкуете в исходной фразе указывалось что " в 1 базе может "гипотетически" быть неограниченное количесвто БД" - а это бред. Даже если файл базы из-за ограничений файловой системы разбивается на несколько частей - это все равно 1 База Данных!

Цитировать
К Некоторым серверам SQL можно подцепиться не указывая базу данных явно, некоторые сервера к чему-нибудь тебя сами подцепят, некоторые сервера вообще позволяют выборки делать из разных баз данных. Так, например, в Transact-SQL прокатит такой запрос влегкую select * from [bd1].[owner1].[table1], [bdi].[ownerj].[tablek] where ... .
с постиджем я не работал ни разу только в основном с мускулем и с мелкомягким... какие там нюансы хз, но сильно отличаться не должно.

И что - я это отрицал??? Просто драйвера Qt позволяют устанавливать соединения с БД а не с сервером БД. Кроме того через драйвер FB создать базу вашим способом мне так и не удалось! Пользователь и пароль - все на местах. И особенностей у БД больше чем вы предполагаете, я все таки считаю что создавать Базу специально подключившись к другой Базе Некрасиво и Неправильно. Представьте если кто-то будет поддерживать программу в которой БД создается таким неявным способом, не сразу можно понять что подключение к временной БД нужно только чтобы получить доступ к функциям сервера для создания Базы.

Цитировать
Это тебя заботить не должно. лишь бы знал какую тебе базу эксплуатировать в итоге нужно.
Нет вы не понимаете часто не большая программа работающая с БД сама ставит сервер и никаких левых баз на компе нет - просто некчему подключиться чтобы потом создавть свою БД!

Цитировать
Это тебя вообще ни как не касается, это головная боль администратора SQL-сервера как и резервирование, как и назначение прав юзерам, и другие технические вопросы. Все что тебя должно заботить это знание адреса сервера в сети, порт на котором интересующий SQL-сервер сидит, твой логин с паролем с достаточными правами и название твоей БД. Все остальное не твое, или твое, если ты по совместительству еще и админ сервера.
БЛА БЛА БЛА - вы не писали программ которые работают с БД? -- неужели думаете что кто-то сделает работу за вас? Возьмем конкретный пример - "программа телефонный справочник" - пользователь купил диск - поставил на свой компьютер - программа работает с базой данных локально - не через интернет - что ему позвать админа, поторый настроет SQL сервер и поймет почему программа не взаимодействует с БД. Все должно работать сразу - из коробки - программа при установки должна проанализировать стоит ли сервер БД - если нет или не той версии то предложить поставить его с указанием что если этого не сделать, то ничего не заработает, и самое главное сама доллжна распаковать/создать свою базу, положить куда надо, чтобы программа могла достучаться к ней!!! И будьте уверены этот пример не надуман - заботиться о расположении, правах и др. вещах сервера Базы не надо только в интернет проектах работающих на специальных хостингах или на крупных закрытых проетах где дейвствительно куча админов - билинговые системы или др...


Цитировать
Как бы стандарт SQL-92 года и все последующие стандарты SQL содержат в себе языковые конструкции по управлению базами данны (не только ими  (в широком смысле)) сссно всякий SQL-сервер, если это SQL-сервер, обязан обеспечивать создание баз данных своими SQL конструкциями. Т.е., выходит, не костыль.

Да но кто говорит что эти конструкции должны работать выполняясь из открытой транзакции к конкретной БД - например я даже в IBExpert не могу выполнить CREATE DATABASE в окошке построения запросов конкретной БД - а вот в isql (спец утилита управления сервером) можно. Вообще не знаю оговорено ли это стандартами но есть конструкции позволяющие делать запросы а есть меняющие метаданные - CREATE TABLE, CREATE DATABASE и т.д. - в FB это называется DDL. и не все вещи из DDL работают в запросах...



Название: Re: CREATE DATABASE
Отправлено: BaltikS от Октябрь 19, 2009, 16:57
Одни эмоции... У меня создалось впечатление, что Вас задело ваше же не знание. У каждого сервера - свои особенности. И уж поверьте если бы я делал "программа телефонный справочник" то никак бы не связывался с PostgreSQL и взял бы SQLITE... Ваши ответы (без обид) не по-существу и выражают лишь негативный способ восприятия управления БД PostgreSQL. Моё мнение отличное от вашего, причём в обратную сторону, как и большинство знающих людей! Вы тут критиковали маленькую утилиту psql которая создаёт базу(хотя реально создаёт не она, а createdb), но сами же пишите про
Цитировать
isql (спец утилита управления сервером)
... Разберитесь в своих мыслях, иначе нам вас не понять...


Название: Re: CREATE DATABASE
Отправлено: Пантер от Октябрь 19, 2009, 17:13
break:
Ты путаешь немного серверные БД с обычными. PostgreSQL - серверная БД. Для ее работы нужно установить и настроить серверную часть, а потом к ней коннектиться. А то, о чем ты говоришь, называется embeded. Т.е. работа через локальную БД. На сколько я знаю, в постгресе такого нет, а в огнептице и в мускуле есть. Что тебе мешает распространять скрипт инициализации вместе со своею программой? Как вариант, можно предусмотреть возможность работы без сервера, но использовать тогда в несерверном режиме SQLite.


Название: Re: CREATE DATABASE
Отправлено: break от Октябрь 19, 2009, 18:17
Цитировать
Ты путаешь немного серверные БД с обычными. PostgreSQL - серверная БД. Для ее работы нужно установить и настроить серверную часть, а потом к ней коннектиться. А то, о чем ты говоришь, называется embeded.
Ничего я не путаю - работал и с серверным вариантом и с embedded и доводы привожу весьма весомые - а назвать эмоциями - ума большого не надо! Просто представьте что эта же самая программа "телефонный справолчник" сетевая с бд на одном компьютере и кучей клиентских соединений. Если для справочника телефонов это слишком - то для программы "тест" кот. есть в большинстве учебных заведений - самое оно - и что обязательно вызывать спец админа для настройки такой программы? Кстати говоря Firebird серверная БД но для ее настройки не требуется никакихз особых манипуляций - просто проследуйте совету мастера установки. Это и сделано для возможности писать полноценные сетевые программы работы с БД кот. не требуеют для обслуживания спец админа.

Цитировать
Вы тут критиковали маленькую утилиту psql
ткни место где я критиковал утилиту или показывал негативное отношение к Postgress??? Я наоборот предложил использование подобной утилиты в самом первом своем посте вместо замысловатых манипуляций с подключением к чужой базе. Так что ".. Разберитесь в своих мыслях..." а потом уж мои критикуйте.


Название: Re: CREATE DATABASE
Отправлено: BaltikS от Октябрь 20, 2009, 06:57
Цитировать
ткни место где я критиковал утилиту или показывал негативное отношение к Postgress
Да, согласен, упустил про кртитику, извиняюсь.  Я немного неправильно выразился по поводу негатива не Postgres-а, не его, а метода подхода. Конечно, для учебных заведений может спору нет, FB и подойдёт и в некоторых случаях будет удобней. Теперь назови то, что есть в Firebird и чего нет в PostgreS??? То что существует возможность удалённо создать базу через подключение к БД (даже удалённое) - это скорее плюс. И недостаток FB....


Название: Re: CREATE DATABASE
Отправлено: CroCIV от Октябрь 20, 2009, 09:09
Цитировать
У одного SQL-сервера может быть несколько баз данных.
Не может быть а я то 5 лет думал что с одним сервером только 1 база работать может - только почему вы мне не про то толкуете в исходной фразе указывалось что " в 1 базе может "гипотетически" быть неограниченное количесвто БД" - а это бред. Даже если файл базы из-за ограничений файловой системы разбивается на несколько частей - это все равно 1 База Данных!

СУБД - это не БД, а Система ею Управляющая, т.о. SQL-сервер - частный случай СУБД.

И что - я это отрицал??? Просто драйвера Qt позволяют устанавливать соединения с БД а не с сервером БД.

Кроме того через драйвер FB создать базу вашим способом мне так и не удалось! Пользователь и пароль - все на местах. И особенностей у БД больше чем вы предполагаете, я все таки считаю что создавать Базу специально подключившись к другой Базе Некрасиво и Неправильно. Представьте если кто-то будет поддерживать программу в которой БД создается таким неявным способом, не сразу можно понять что подключение к временной БД нужно только чтобы получить доступ к функциям сервера для создания Базы.

Поправьте, если я ошибаюсь: 1) у СУБД есть служебные БД (хотябы одна); 2) если явно имя БД не указано, то, в зависимости от настроек и особенностей SQL-сервера, юзера коннектит к БД назначенной ему по умолчанию или к служебной БД; 3) SQL-сервер !!!поддерживает!!! стандарт SQL-92 года (т.е. это как минимум означает, что он имеет полный набор типов данных стандарта, поддерживает полный набор языковых конструкций стандарта, т.е. другими словами, я могу, руководствуясь стандартом SQL-92, создать любой заковыристый запрос, и этот запрос на СУБД, претендующей на звание SQL-сервера, этот запрос выполнит с таким же результатом, что и другие SQL-сервера) 4) (частный случай 3) SQL-сервер с помощью SQL позволяет создавать/переименовывать/удалять/копировать базы данных.

Если у вас это так, то в чем проблема мне не понятно.
Если у вас это не так в пунктах 1) и 2), то нужно курить доку работы с драйвером представляющим из себя интерфейс между клиентом и SQL-сервером, и поддерживающим диалог с клиентом посредством SQL конструкций, на предмет как на нем реализовать пункт 4).
Если у вас это не так в пункте 4) или, темболее 3) то зачем вам такой "SQL"-сервер  ???

Нет вы не понимаете часто не большая программа работающая с БД сама ставит сервер и никаких левых баз на компе нет - просто некчему подключиться чтобы потом создавть свою БД!
Если, разрабатываемый вами, программный комплекс не подразумевает многопользовательской работы, и нет необходимости решать коллизи по доступу к данным, и решать проблемы единого централизованного или распределенного хранения данных, то SQL-сервер лучше не использовать, вам подойдет СУБД попроще (по воробьям из пушки стрелять не целесообразно).
Если, разрабатываемый вами, программный комплекс подразумевает многопользовательскую работу с единым централизованным или распределенным хранением данных так, что необходимо решать коллизи по доступу к данным, то 1) SQL-сервр оправдан 2) если вы в програмный продукт включаете автоматическую установку и настройку SQL-сервера, то это либо совсем частный не универсальный случай (а по тому и не грамотный), ну нормально если будет на одном компьютере установлено 10 программ и у каждой будет по своему MySQLю, у одной будет MySQL 3, у другой MySQL 4, у третьей MySQL Embeded у четвертой MySQL Lite, у пятой MySQL 3.3 и т.д., и на каждом сервере будет по одной - две базы данных, каждая запустит по 3-5 служб в систему, каждая зажмет свой порт, которые кстати придется разруливать программно, каждая сожрет пространство системными таблицами, засрет реестр или конфигурационные файлы.... 3) либо это универсальный мега код продумывающий абсолютно все нюансы установки/настройки SQL-серера или использования уже имеющегося, и я перед вами снимаю шляпу и склоняю колено.

БЛА БЛА БЛА - вы не писали программ которые работают с БД?
писал чутку  ::)

Да но кто говорит что эти конструкции должны работать выполняясь из открытой транзакции к конкретной БД - например я даже в IBExpert не могу выполнить CREATE DATABASE в окошке построения запросов конкретной БД - а вот в isql (спец утилита управления сервером) можно.
Способ быть должен, я б даже сказал обязан, если этого нельзя с данным драйвером можно взять другой, если этого нельзя из открытого соединения к конкретной БД, то должно быть можно как-то подругому. Если SQL-сервер умеет делать селекты и упдейты, а делеты не умеет, то это не SQL-сервер :-\ тоже самое касается и криейтов, упдейтов и дропов баз данных никаких исключений тут быть не может. Стандарт на то и стандарт что это стандар а не абычО.


Название: Re: CREATE DATABASE
Отправлено: Vexator от Октябрь 20, 2009, 09:32
на сколько я понял автора топика, его смущает, что мы подключаемся не к СУБД, и указываем ей на создание новой БД, а к "какой то временной БД" в этой СУБД, и потом уже создаем новую БД. в принципе это не совсем логично, это как если бы в painte для создания нового рисунка, надо было бы предварительно открыть другой, уже существующий :) так что в чем то автор и прав. или я что то не допонял?

----
ну и в принципе права и вторая сторона:
паинт то тоже имеет свое служебное пространство для работы с новыми данными, в SQL те же функции выполняют служебные БД, к которым, как тут верно подметили, выполняется подключение, если БД не указана...


Название: Re: CREATE DATABASE
Отправлено: break от Октябрь 20, 2009, 11:50
Цитировать
на сколько я понял автора топика, его смущает, что мы подключаемся не к СУБД, и указываем ей на создание новой БД, а к "какой то временной БД" в этой СУБД, и потом уже создаем новую БД. в принципе это не совсем логично, это как если бы в painte для создания нового рисунка, надо было бы предварительно открыть другой, уже существующий  так что в чем то автор и прав. или я что то не допонял?
Да вы правильно меня поняли.

Просто для меня это странно что мы подключились к Базе стартовали транзакцию к ней и в контексте это транзакции(котора/я вроде как должна содержать изменения в этой БД) создаем другую базу. А если транзакция RollBack то логично ли что новосозданная БД должна удалиться?

Цитировать
в SQL те же функции выполняют служебные БД, к которым, как тут верно подметили, выполняется подключение, если БД не указана...
серверов много разных в FB например если ничего не указать -то ни к чему не подключишься, так же в SQLite.

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


Название: Re: CREATE DATABASE
Отправлено: CroCIV от Октябрь 20, 2009, 12:31
Просто для меня это странно что мы подключились к Базе стартовали транзакцию к ней и в контексте это транзакции(котора/я вроде как должна содержать изменения в этой БД) создаем другую базу. А если транзакция RollBack то логично ли что новосозданная БД должна удалиться?
Эмм.. а, я надеюсь, это очевидно, что создание базы данных нельзя объединять в единую атомарную операцию с, например, созданием таблиц в ней? М.б. потому и не создается база данных, что она включена в транзакцию? Ее надо отдельно создавать или в транзакции с созданием других БД. Создание таблиц БД возможно после того, как подкоммитили создание БД, это уже следующая транзакция, и т.д.


Название: Re: CREATE DATABASE
Отправлено: break от Октябрь 20, 2009, 13:00
Блин я про таблицы хоть слово сказал?


Название: Re: CREATE DATABASE
Отправлено: CroCIV от Октябрь 20, 2009, 13:32
Мне вот эта фраза показалась странной 
А если транзакция RollBack то логично ли что новосозданная БД должна удалиться?
звучит, как будто в одну транзакцию собрано чота в том числе и создание БД. в МуСкуле и МС Скуле такое не прокатит, я пробовал  ;D
тогда да, это вполне логично.


Название: Re: CREATE DATABASE
Отправлено: Пантер от Октябрь 20, 2009, 16:42
Пиплы, говорю всем, в том числе и себе - перед тем, как что-то доказывать/хаять, проверьте.
Код
C++ (Qt)
#include <QtCore/QCoreApplication>
 
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlError>
#include <QtSql/QSqlQuery>
 
int main(int argc, char** argv)
{
QCoreApplication app(argc, argv);
 
QSqlDatabase base = QSqlDatabase::addDatabase("QPSQL");
base.setHostName("localhost");
base.setUserName("postgres");
base.setPassword("postgres");
 
if (!base.open()) {
qDebug(base.lastError().text().toLocal8Bit());
}
QSqlQuery query;
query.exec("CREATE DATABASE tmp_base");
qDebug(query.lastError().text().toLocal8Bit());
 
base.close();
return 0;
}
 
Все отлично работает и никакой БД указывать при коннекте не нужно. Тему, считаю, можно закрывать.


Название: Re: CREATE DATABASE
Отправлено: break от Октябрь 20, 2009, 19:46
Цитировать
Все отлично работает и никакой БД указывать при коннекте не нужно. Тему, считаю, можно закрывать.

Хорошо а что тогда открывает оператор if (!base.open()) в вашем примере? если не другую БД?


Название: Re: CREATE DATABASE
Отправлено: Пантер от Октябрь 20, 2009, 19:56
Открывает соединение с сервером.


Название: Re: CREATE DATABASE
Отправлено: CroCIV от Октябрь 21, 2009, 07:37
Во, сразу видно практика, а не какого-нибудь там теоретика. Мне было влома сервер ставить, и так подтормаживает все, но знал, что как-то так работать и должно.  :)


Название: Re: CREATE DATABASE
Отправлено: break от Октябрь 21, 2009, 11:07
Цитировать
Во, сразу видно практика, а не какого-нибудь там теоретика. Мне было влома сервер ставить, и так подтормаживает все, но знал, что как-то так работать и должно.

Сам ты теоретик я с БД 5 лет работаю и эта ситуация с FB не катит - проверил еще в асамом начале.


Название: Re: CREATE DATABASE
Отправлено: BaltikS от Октябрь 21, 2009, 11:33
Можно всё жизнь на SQLit-е сидеть и бить себя в грудь...но этого ничего не изменит! Да с FB - не катит, с другими -  катит!


Название: Re: CREATE DATABASE
Отправлено: break от Октябрь 21, 2009, 12:09
Ну судя по тому как вы себя бьете в грудь - да можно и не важно какая БД

а на счет метода open из асистента:

Opens the database connection using the current connection values. Returns true on success; otherwise returns false. Error information can be retrieved using lastError().

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

1) Не соответствует документации (там ничего не сказано про соединение с сервером после которого сожно создавать метаданные в том числе Базу)
2) Не интуитивно и вообще не понятно что будет если сделать rollback
3) Не имеет смысла т.к. чтобы работать с созданной Базой все равно потребуется переподключиться к ней через QSqlDatabase
4) Есть как минимум 2 способа сделать то же самое более правильным и понятным способом

а вы господа BaltikS и CroCIV - наверное пока работаете на уровне сделать "чтобы заработало" а не сделать правильно и красиво чтобы другой программист взявшись за поддержку проекта сразу мог понять в чем дело

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

Кроме того кокретно применительно к FB на этом форуме обсуждался вопрос создания БД средствами QT и он так и не был решен средствами CREATE DATABASE

http://www.prog.org.ru/topic_3265_0.html

http://www.prog.org.ru/index.php?topic=9400.msg53633#msg53633


Название: Re: CREATE DATABASE
Отправлено: BaltikS от Октябрь 21, 2009, 12:33
Уважаемый break, мой стаж работы с базами повыше вашего и я бы на вашем месте не стал бы так утверждать! То что Вам кажется не логичным не правильным - сугубо Ваша точка зрения! Пробелы Вашего же не знания, Вы пытаетесь перекинуть на личные! Мне например всё равно открывается база или сессия....подозреваю, что если не указывается имя базы в Postgres, то автоматом идёт подключения к базе к template1. Но разговор совершенно не об этом... Я перечитал заново топик и Ваш вопрос был именно почему у меня не работает Create Database с FB... Видимо Вы работая 5 лет с ним так и не поняли, что в нём это сделать нельзя. А попытки Вас убедить, что в некоторых СУБД это возможно, Вы просто выражете в виде истерики и споров. Как говорится надо Учится, учится и ещё раз учится...


Название: Re: CREATE DATABASE
Отправлено: break от Октябрь 21, 2009, 12:45
хоть один технический вопрос в вашем посте описан - только ваше отношение ко мне - и это не первый раз уже ( "МОЙ ОПЫТ ПОВЫШЕ ВАШЕГО........") !

Цитировать
То что Вам кажется не логичным не правильным - сугубо Ваша точка зрения!

Так я свою точку зрения и выражаю - это и так понятно - истерики как раз у вас.

Цитировать
Мне например всё равно открывается база или сессия....подозреваю, что если не указывается имя базы в Postgres, то автоматом идёт подключения к базе к template1.

Так вы подозреваете - то есть даже не знаете 100% как оно работает?


Название: Re: CREATE DATABASE
Отправлено: BaltikS от Октябрь 21, 2009, 12:49
:) улыбнул этот парень....я больше не буду отвечать на глупые вопросы... :)


Название: Re: CREATE DATABASE
Отправлено: break от Октябрь 21, 2009, 13:45
Цитировать
улыбнул этот парень....я больше не буду отвечать на глупые вопросы..
очередная несодержательная нападка


Название: Re: CREATE DATABASE
Отправлено: CroCIV от Октябрь 21, 2009, 13:55
так, разбежались по комнатам  ;D, я под теоретиками не имел ввиду кого-то конкретного, а в общем всех, т.к. проблемы на самом деле нет, а тема раскатана на 3 страницы. И потом, теоретик - это такое же обзывательство как и интеллигент.

З.Ы.: Моя задача - вкрутить в патрон лампу. Все, что мне надо знать, это чтоб патрон, лампа и электричество в сети соответствовали единым стандартам, чтоб лампа, и вкрутилась, и светила. Мне совершенно все равно из какого они теста, или какой у патрона серийный номер, или сколько сигарет выкурил за смену Вася в которую этот патрон изготовил. И, если патрон имеет какие-то индивидуальные особенности, и чтобы в него лампу грамотно вкрутить надо подкладывать токопроводящую пластинку в основание, и потом еще все скотчем зафиксировать, то зачем мне этот патрон? Это называется не особенности, а брак. вот бы и с компиляторами такая же фигня была, каждый компилятор с++ пусть бы компилировал по своему так, чтоб исходный код между ними переносим не был, я б точно тогда на яву перешел.
 
Вот лично я делаю упор на использование стандартных типов и стандартных языковых конструкций и потому я не привязан к какому-то конкретному серверу, вот завтра оракул поглатит огнептица и мускуль и закроет их нафиг, и вот не знаю как вам, а мне переписывать мегабайты кода не придется, весь мой гемор будет в том, чтобы установить новый сервер и перекинуть на него базу со стандартными типами, ну максимум день.


Название: Re: CREATE DATABASE
Отправлено: Vexator от Октябрь 22, 2009, 04:17
Вот лично я делаю упор на использование стандартных типов и стандартных языковых конструкций и потому я не привязан к какому-то конкретному серверу, вот завтра оракул поглатит огнептица и мускуль и закроет их нафиг, и вот не знаю как вам, а мне переписывать мегабайты кода не придется, весь мой гемор будет в том, чтобы установить новый сервер и перекинуть на него базу со стандартными типами, ну максимум день.
+1
вообще бесит, что существуют уникальные конструкции, выпадающие из стандартов, по началу было очень не приятно узнавать, что используемые тобой конструкции, не будут работать на другом сервере


Название: Re: CREATE DATABASE
Отправлено: break от Октябрь 22, 2009, 11:02
Цитировать
вообще бесит, что существуют уникальные конструкции, выпадающие из стандартов, по началу было очень не приятно узнавать, что используемые тобой конструкции, не будут работать на другом сервере

Создание БД указанным способом как раз и является такой конструкцией - неявной и неработающей на другом сервере, кроме того не описанной в документации поэтому именно эта ситуация и мне не нравится.