Полезная информация

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№106-06-2011 02:18:05

bidlocoder
Участник
 
Группа: Members
Зарегистрирован: 30-09-2010
Сообщений: 52
UA: Firefox 4.0

sql insert

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

Выделить код

Код:

INSERT INTO test  VALUES  ('1902921657','.hotlog.ru','true','false','hotcli','/','0','0','dae09f0c94d2966ab3012f593f3c81')

работает нормально, а вот вставка нескольких строк


Выделить код

Код:

INSERT INTO test (expires, host, isDomain, isSecure, name, path, policy, status, value) VALUES
 ('1902921657','.hotlog.ru','true','false','hotcli','/','0','0','dae09f0c94d2966ab3012f593f3c81'),
('1338236106','.vkontakte.ru','true','false','remixchk','/','0','0','5')

не работает
ведь должно  работать, вроди как, а не хочет

что я делаю не так?

Отредактировано bidlocoder (06-06-2011 02:19:55)

Отсутствует

 

№206-06-2011 02:48:00

hydrolizer
Участник
 
Группа: Extensions
Зарегистрирован: 22-07-2009
Сообщений: 1945
UA: Firefox 5.0

Re: sql insert

bidlocoder пишет

не работает

1. Как не работает? Вызывает краш FF? Вызывает BSOD? Выбрасывает эксепшн? Просто не видно новых данных?
2. Вставляйте новые данные, особенно если их больше 1-й записи, так, как это обычно принято делать: явно открывайте транзакцию, используйте параметризированные statements, по завершении явно выдавайте commit/rollback. Кстати, для пакетной обработки нескольких statements у обертки sqlite в FF есть спец. метод mozIStorageConnection.executeAsync. Метод, как это следует из его названия, асинхронный.

Отредактировано hydrolizer (06-06-2011 02:59:06)

Отсутствует

 

№306-06-2011 02:57:20

bidlocoder
Участник
 
Группа: Members
Зарегистрирован: 30-09-2010
Сообщений: 52
UA: Firefox 4.0

Re: sql insert

вызывает эксепшн, ругается на синтаксис запроса

вот что пишет:
1)если запускаю в sqlLite Manager
SQLiteManager: Likely SQL syntax error: INSERT INTO test (expires, host, isDomain, isSecure, name, path, policy, status, value) VALUES
('1902921657','.hotlog.ru','true','false','hotcli','/','0','0','dae09f0c94d2966ab3012f593f3c81'),
('1338236106','.vkontakte.ru','true','false','remixchk','/','0','0','5')

[ near ",": syntax error ]


Exception Name: NS_ERROR_FAILURE
Exception Message: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [mozIStorageConnection.createStatement]

2)если с приложения
[Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [mozIStorageConnection.createStatement]"  nsresult: "0x80004005 (NS_ERROR_FAILURE)"  location: "JS frame :: chrome://executejs/content/executejs/executeJS.js :: <TOP_LEVEL> :: line 235"  data: no]

Отредактировано bidlocoder (06-06-2011 03:01:01)

Отсутствует

 

№406-06-2011 03:00:05

hydrolizer
Участник
 
Группа: Extensions
Зарегистрирован: 22-07-2009
Сообщений: 1945
UA: Firefox 5.0

Re: sql insert

bidlocoder пишет

вот что пишет:

Ну так у вас же

bidlocoder пишет
Выделить код

Код:

INSERT INTO test (expires, host, isDomain, isSecure, name, path, policy, status, value) VALUES
 ('1902921657','.hotlog.ru','true','false','hotcli','/','0','0','dae09f0c94d2966ab3012f593f3c81'),
('1338236106','.vkontakte.ru','true','false','remixchk','/','0','0','5')

Не знаю, откуда вы взяли такой синтаксис вставки нескольких записей, но он явно не ANSI-шный, и поэтому вовсе не обязан работать в sqlite. ANSI-стандарт предполагает только 2 варианта использования insert: для одиночной записи -

insert into table_name [(columns_list)] values(values_list)

для нескольких записей -

insert into table_name [(columns_list)] select ...

И всё. Хотите вставить несколько записей с данными, заданными в виде значений - используйте несколько отдельных statements по одному на каждую запись

Отсутствует

 

№506-06-2011 03:04:29

bidlocoder
Участник
 
Группа: Members
Зарегистрирован: 30-09-2010
Сообщений: 52
UA: Firefox 4.0

Re: sql insert

я уже пробовал, получается ну ОООООчень медленно(((
цикл 50 итераций около  10 сек

Отредактировано bidlocoder (06-06-2011 03:06:09)

Отсутствует

 

№606-06-2011 03:40:11

hydrolizer
Участник
 
Группа: Extensions
Зарегистрирован: 22-07-2009
Сообщений: 1945
UA: Firefox 5.0

Re: sql insert

bidlocoder
Вставка 10 000 значений - меньше, чем за 1 секунду (и отнюдь не на мощном компьтере):

Выделить код

Код:

const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
try 
{
  var dbFile=Services.dirsvc.get("ProfD", Ci.nsILocalFile);
  dbFile.append("foo.sqlite");
  var ssvc=Cc["@mozilla.org/storage/service;1"].getService(Ci.mozIStorageService);
  var mDBConn = ssvc.openDatabase(dbFile);
  try{ mDBConn.executeSimpleSQL("drop table foo"); } catch(err){}
  mDBConn.executeSimpleSQL("create table foo(n integer)");
  var insertStatements=[];
  var insertSQL="insert into foo values(:n)";
  for(var i=0;i<10000;i++)
  {
    var statement=mDBConn.createStatement(insertSQL);
    statement.params.n=i;
    insertStatements.push(statement);
  }
  var startTime=new Date().getTime();
  mDBConn.beginTransaction();
  mDBConn.executeAsync(insertStatements, insertStatements.length, 
  {
    handleError: function(aError)
    {
      Services.console.logStringMessage(aError.message);
    },
    
    handleCompletion: function(aReason) 
    {
      if (aReason!=0)
      {
        Services.console.logStringMessage("executeAsync finished with reason: "+aReason);
        return;
      }
      mDBConn.commitTransaction();
      Services.console.logStringMessage("insert completed in " +(new Date().getTime()-startTime)+"msec");
      mDBConn.asyncClose(function()
      {
        Services.console.logStringMessage("connection closed");
      });
    },
    handleResult: function(aResultSet) {}
  });
} catch(err)
{
  Services.console.logStringMessage(err+"\n"+err.stack);
}

(точнее - ~250 мсек. на селероне 1.86 ГГц с 1 Мб ОЗУ).

Отсутствует

 

№706-06-2011 07:12:43

hydrolizer
Участник
 
Группа: Extensions
Зарегистрирован: 22-07-2009
Сообщений: 1945
UA: Firefox 5.0

Re: sql insert

Стало самому интересно насчет скорости - набросал и прогнал тесты для вставки 10 000 строк в разных вариантах. Тесты выложены здесь: http://pastebin.mozilla-russia.org/108842 (не стал приводить код в теме, т.к. кода достаточно много). Варианты по ссылке:
executeAsync - асинхронное выполнение параметризованного insert в транзакции (я немного изменил код, там параметризация делается через массив параметров)
executeSync - синхронное выполнение непараметризованного insert без транзакции
executeSyncX - синхронное выполнение непараметризованного insert в транзакции
executeSyncXX - синхронное выполнение параметризованного insert без транзакции
executeSyncXXX - синхронное выполнение параметризованного insert в транзакции.
Места распределились так:
1-е место по скорости отработки - асинхронное выполнение параметризованного insert в транзакции (меньше 100 мсек)
2-е место - синхронные варианты в транзакции (~250-300 мсек)
3-е место - варианты без транзакции. Есть ли разница в наличии параметризации, или нет, я так и не смог узнать, т.к. не хватило терпения дождаться окончания отработки каждого из них. Ждал минут по 10 точно.
Комментарии, думаю, излишни.

Отредактировано hydrolizer (06-06-2011 07:13:30)

Отсутствует

 

№806-06-2011 17:24:17

bidlocoder
Участник
 
Группа: Members
Зарегистрирован: 30-09-2010
Сообщений: 52
UA: Firefox 4.0

Re: sql insert

спасибо за дельный совет и приведенный код
разбираюсь что куда..............

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]