matplotlib.cbook.flatten()
будет работать для вложенных списков, даже если они гнездятся более глубоко, чем пример.
import matplotlib
l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
print(list(matplotlib.cbook.flatten(l)))
l2 = [[1, 2, 3], [4, 5, 6], [7], [8, [9, 10, [11, 12, [13]]]]]
print list(matplotlib.cbook.flatten(l2))
Результат:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
Это на 18 раз быстрее, чем подчеркивание. _.flatten:
Average time over 1000 trials of matplotlib.cbook.flatten: 2.55e-05 sec
Average time over 1000 trials of underscore._.flatten: 4.63e-04 sec
(time for underscore._)/(time for matplotlib.cbook) = 18.1233394636
Вы можете использовать такую команду:
CREATE TABLE copied AS SELECT * FROM mytable WHERE 0
, но из-за динамической типизации SQLite большая часть информации о типе будет потеряна.
Если вам нужна только таблица, которая ведет себя как и оригинал, т. е. имеет одинаковое число и имена столбцов и может хранить одни и те же значения. Этого достаточно.
Если вам действительно нужна информация типа точно так же, как оригинал, вы можете прочитать оригинал SQL CREATE TABLE
из таблицы sqlite_master
, например:
SELECT sql FROM sqlite_master WHERE type='table' AND name='mytable'
Я бы предпочел:
> sqlite3 <db_file>
sqlite3 > .output <output_file>
sqlite3 > .dump <table_name>
Строка выше генерирует дамп таблицы, который включает в себя инструкции DDL и DML.
Внесите изменения в этот файл, то есть найдите и замените имя таблицы с новым именем таблицы
Кроме того, замените "CREATE TRIGGER "
на "CREATE TRIGGER <NEWTABLE>_"
, это заменит существующие триггеры именами триггеров с новым именем таблицы на нем. Это сделает его уникальным и не вызовет конфликтов с существующими триггерами. После того, как все изменения схемы реализованы, прочитайте его обратно в базу данных с помощью .read
sqlite3 > .read output_file
. Это можно записать в файл оболочки с помощью команд оболочки, таких как:
echo ".dump <table>" | sqlite3 <db_file> > <table_file>
sed -i.bak "s/\b<table_name>\b/<new_table_name>/g" <table_file>
sed -i.bak "s/\bCREATE TRIGGER \b/CREATE TRIGGER <new_table_name_>/g" <table_file>
echo ".read <table_file>" | sqlite3 <db_file>
rm <table_name>.bak
Например :
Если у вас есть таблица T, а новая таблица TClone в файле db D с созданным файлом F: then
echo ".dump T" | sqlite3 D.sqlite > F
sed -i.bak "s/\bT\b/TClone/g" F
sed -i.bak "s/\bCREATE TRIGGER \b/CREATE TRIGGER TClone_>/g" F
echo ".read F" | sqlite3 D.sqlite
rm T.bak
Наконец, вы можете обобщить этот скрипт, создав параметризованной версии, где вы можете передать исходную_таблицу, destination_table, db_file в качестве параметров, которые могут быть использованы для клонирования любой таблицы.
Я тестировал это, и он работает.
Тестирование:
sqlite3 <database_file>
sqlite3 > select * from <new_table>;
должен дать вам те же результаты, что и исходная таблица. и
sqlite3 > .schema <new_table>
должны иметь такую же схему, что и исходная таблица с новым именем.
SQLite не может клонировать таблицу с PK, значениями по умолчанию и индексами.
Необходим взлом другим инструментом.
В оболочке замените имя таблицы на sed.
sqlite3 dbfile '.schema oldtable' | sed '1s/oldtable/newtable/' | sqlite3 dbfile
И вы можете проверить новую таблицу.
sqlite3 dbfile '.schema newtable'
Первичный ключ, значения по умолчанию и индексы будут зарезервированы.
Надеюсь, эта команда вам поможет.