Мне легче запомнить, как это работает, тогда я могу выяснить какую-то конкретную комбинацию пуска / остановки / шага.
Поучительно сначала понять range()
:
def range(start=0, stop, step=1): # illegal syntax, but that's the effect
i = start
while (i < stop if step > 0 else i > stop):
yield i
i += step
Начните с start
, приращение на step
, не достиг stop
. Очень просто.
Вещь, которую следует помнить об отрицательном шаге, заключается в том, что stop
всегда является исключенным концом, будь то выше или ниже. Если вы хотите, чтобы один и тот же срез находился в противоположном порядке, намного проще делать разворот отдельно: например. 'abcde'[1:-2][::-1]
срезает один символ слева, два справа, затем меняет направление. (См. Также reversed()
.)
Последовательность разреза такая же, за исключением того, что она сначала нормализует отрицательные индексы и никогда не может выйти за пределы последовательности:
TODO : В приведенном ниже коде была ошибка с «никогда не выходить за пределы последовательности», когда abs (шаг)> 1; Я думаю, Я исправил его правильно, но это трудно понять.
def this_is_how_slicing_works(seq, start=None, stop=None, step=1):
if start is None:
start = (0 if step > 0 else len(seq)-1)
elif start < 0:
start += len(seq)
if not 0 <= start < len(seq): # clip if still outside bounds
start = (0 if step > 0 else len(seq)-1)
if stop is None:
stop = (len(seq) if step > 0 else -1) # really -1, not last element
elif stop < 0:
stop += len(seq)
for i in range(start, stop, step):
if 0 <= i < len(seq):
yield seq[i]
Не беспокойтесь о деталях is None
- просто помните, что опускание start
и / или stop
всегда делает правильную вещь, чтобы дать вам целую последовательность.
Нормализовать отрицательные индексы сначала позволяет запускать и / или останавливаться, чтобы считаться с конца независимо: 'abcde'[1:-2] == 'abcde'[1:3] == 'bc'
, несмотря на range(1,-2) == []
, Нормализацию иногда называют «по модулю длины», но обратите внимание, что она добавляет длину только один раз: например. 'abcde'[-53:42]
- это целая строка.
Использовать ниже хранимой процедуры ::
DELIMITER $$
CREATE
PROCEDURE `Rename_Tables`()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE tableName VARCHAR(50);
DECLARE newTableName VARCHAR(70);
DECLARE t_query VARCHAR(500);
DECLARE cur1 CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_name LIKE '%table_test' AND table_schema='test' ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO tableName;
IF done THEN
LEAVE read_loop;
END IF;
SET newTableName = SUBSTRING(tableName, 1,LOCATE('_',tableName)-1);
SET t_query = CONCAT('RENAME TABLE ', tableName, ' TO ', newTableName);
SET @myQuery = t_query;
PREPARE stmt FROM @myQuery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
END$$
DELIMITER;
Заменить table_schema своим именем table_schema.
Например:
select group_concat(v.name SEPARATOR ' ')
from (
select concat('rename table ', t.table_name, ' to ', substring(reverse(v.name), instr(reverse(v.name), '_') + 1, length(v.name)) name
from information_schema.tables t
where
table_schema = 'put_your_table_schema'
and table_name like '%_test'
) v;
substring(reverse.....)
вместо простого replace(v.name, '_test', '')
используется потому что мы должны быть уверены, что мы заменим только вхождения _test
только в конце строки. Надеюсь, что это поможет
Я хотел обновить то, что сработало для меня, поскольку этот пост довольно старый. Мне нужно было добавить знак до и после имен таблиц. И не забудьте добавить последнее; потому что это иногда может вызывать синтаксическую ошибку.
SET group_concat_max_len=5000;
SELECT group_concat(v.name separator '; ')
FROM (
SELECT concat('RENAME TABLE `', t.table_name, '` TO `', replace(t.table_name, 'wp_', 'wplocal_'), '`') name
FROM information_schema.tables t
WHERE table_name like 'wp_%'
) v;
Небольшая модификация ответа @ ravnur:
SET group_concat_max_len=5000;
SELECT group_concat(v.name separator '; ')
FROM (
SELECT concat('RENAME TABLE ', t.table_name, ' TO ', replace(t.table_name, 'wp_', 'blog_')) name
FROM information_schema.tables t
WHERE table_name like 'wp_%'
) v;
Полезно, если вы хотите переименовать свои таблицы Wordpress из префикса по умолчанию от wp_
до blog_
(например). Скопируйте и вставьте вывод этой команды в оболочку mysql или phpMyAdmin.