powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl: Преобразование массивов
1 сообщений из 1, страница 1 из 1
Perl: Преобразование массивов
    #39557166
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Снова нужна помощь специалистов.

Есть объект типа такого:
Код: javascript
1.
2.
3.
4.
5.
6.
{
	"table1": ["id", "name", "paid"],
	"table2": ["id", "name"],
	"table3": ["id", "name", "fld1", "fld2"],
	...
}


Это список сущностей, у которых есть переменное количество атрибутов (полей). В каждой сущности произвольное количество записей (строк).

Мне нужно написать скрипт, который будет осуществлять пакетную загрузку информации о сущностях в БД.
Для этого скрипт генерирует параметрический SQL с произвольным количеством параметров, например:
Код: sql
1.
2.
insert into table1 (id, name, paid)
values (?,?,?), (?,?,?), (?,?,?), ...


Выше приведен синтаксис многострочного insert, который вставляет сразу несколько строк (по количеству указанных подстановочных параметров ?).
В БД есть ограничение по максимальному количеству параметров в запросе, поэтому я не могу генерировать SQL для вставки всех строк. В принципе ограничение достаточно большое, но для отладки я взял небольшое значение (не более 10 параметров).
Поскольку количество атрибутов у каждой сущности разное, а вставлять нужно целым числом строк, количество параметров в одном запросе должно быть кратно количеству атрибутов, и при этом не превышать максимальное значение.

Сейчас я составил такой скрипт, который работам правильно и в соответствии с теми требованиями, которые я описал:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
{
	my $sync = {'table1'=>['id','name','paid'], ...};
	my $qs = 10;
	foreach my $tbl (keys %$sync)
	{
		my @fld = @{$sync->{$tbl}};
		my $qr = int($qs/scalar(@fld));
		while (my @bulk = splice(@{$cache->{$tbl}}, 0, $qr))
		{
			my $sql = "insert into $tbl (" . join(",", map {$_} @fld) . ") values "
			. join(", ", map {"(" . join(",", map {"?"} @fld) . ")"} @bulk);
			my $arg = []; foreach my $row (@bulk) { push @$arg, map {$row->{$_}} @fld }
			$tvg->query($sql, $arg);
		}
		$tvg->finish();
	}
}


Здесь $sync это объект со списком сущностей, $qs это максимальное количество параметров, $qr это максимальное количество строк, $cache это источник данных, $tvg это соединение с БД.

Вообщем-то все работает правильно.
Но можно ли избавиться от foreach для получения массива значений параметров $arg ?
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Perl: Преобразование массивов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]