Как я могу сбросить одну таблицу sqlite3 в python?

Я хотел бы сбросить только одну таблицу, но по внешнему виду для этого нет никакого параметра.

Я нашел этот пример дампа, но есть для всех таблиц:

# Convert file existing_db.db to SQL dump file dump.sql import sqlite3, os con = sqlite3.connect('existing_db.db') with open('dump.sql', 'w') as f: for line in con.iterdump(): f.write('%s\n' % line) 

3 Solutions collect form web for “Как я могу сбросить одну таблицу sqlite3 в python?”

Вы можете скопировать только одну таблицу в память db:

 import sqlite3 def getTableDump(db_file, table_to_dump): conn = sqlite3.connect(':memory:') cu = conn.cursor() cu.execute("attach database '" + db_file + "' as attached_db") cu.execute("select sql from attached_db.sqlite_master " "where type='table' and name='" + table_to_dump + "'") sql_create_table = cu.fetchone()[0] cu.execute(sql_create_table); cu.execute("insert into " + table_to_dump + " select * from attached_db." + table_to_dump) conn.commit() cu.execute("detach database attached_db") return "\n".join(conn.iterdump()) TABLE_TO_DUMP = 'table_to_dump' DB_FILE = 'db_file' print getTableDump(DB_FILE, TABLE_TO_DUMP) 

Pro : Простота и надежность: вам не нужно переписывать какой-либо библиотечный метод, и вы более уверены, что код совместим с будущими версиями модуля sqlite3.

Con : Вам нужно загрузить всю таблицу в памяти, что может быть или не быть большим делом в зависимости от того, насколько велика таблица и сколько памяти доступно.

Реализация Dump лежит здесь http://coverage.livinglogic.de/Lib/sqlite3/dump.py.html (локальный путь: PythonPath / Lib / sqlite3 / dump.py)

Вы можете немного изменить его:

 # Mimic the sqlite3 console shell's .dump command # Author: Paul Kippes <kippesp@gmail.com> def _iterdump(connection, table_name): """ Returns an iterator to the dump of the database in an SQL text format. Used to produce an SQL dump of the database. Useful to save an in-memory database for later restoration. This function should not be called directly but instead called from the Connection method, iterdump(). """ cu = connection.cursor() table_name = table_name yield('BEGIN TRANSACTION;') # sqlite_master table contains the SQL CREATE statements for the database. q = """ SELECT name, type, sql FROM sqlite_master WHERE sql NOT NULL AND type == 'table' AND name == :table_name """ schema_res = cu.execute(q, {'table_name': table_name}) for table_name, type, sql in schema_res.fetchall(): if table_name == 'sqlite_sequence': yield('DELETE FROM sqlite_sequence;') elif table_name == 'sqlite_stat1': yield('ANALYZE sqlite_master;') elif table_name.startswith('sqlite_'): continue else: yield('%s;' % sql) # Build the insert statement for each row of the current table res = cu.execute("PRAGMA table_info('%s')" % table_name) column_names = [str(table_info[1]) for table_info in res.fetchall()] q = "SELECT 'INSERT INTO \"%(tbl_name)s\" VALUES(" q += ",".join(["'||quote(" + col + ")||'" for col in column_names]) q += ")' FROM '%(tbl_name)s'" query_res = cu.execute(q % {'tbl_name': table_name}) for row in query_res: yield("%s;" % row[0]) # Now when the type is 'index', 'trigger', or 'view' #q = """ # SELECT name, type, sql # FROM sqlite_master # WHERE sql NOT NULL AND # type IN ('index', 'trigger', 'view') # """ #schema_res = cu.execute(q) #for name, type, sql in schema_res.fetchall(): # yield('%s;' % sql) yield('COMMIT;') 

Теперь он принимает имя таблицы как второй аргумент.
Вы можете использовать его следующим образом:

 with open('dump.sql', 'w') as f: for line in _iterdump(con, 'GTS_vehicle'): f.write('%s\n' % line) 

Получит что-то вроде:

 BEGIN TRANSACTION; CREATE TABLE "GTS_vehicle" ("id" integer NOT NULL PRIMARY KEY, "name" varchar(20) NOT NULL, "company_id" integer NULL, "license_plate" varchar(20) NULL, "icon" varchar(100) NOT NULL DEFAULT 'baseicon.png', "car_brand" varchar(30) NULL, "content_type_id" integer NULL, "modemID" varchar(100) NULL, "distance" integer NULL, "max_speed" integer NULL DEFAULT 100, "max_rpm" integer NULL DEFAULT 4000, "fuel_tank_volume" integer NULL DEFAULT 70, "max_battery_voltage" integer NULL, "creation_date" datetime NOT NULL, "last_RFID" text NULL); INSERT INTO "GTS_vehicle" VALUES(1,'lan1_op1_car1',1,'03115','baseicon.png','UFP',16,'lan_op1_car1',NULL,100,4000,70,12,'2011-06-23 11:54:32.395000',NULL); INSERT INTO "GTS_vehicle" VALUES(2,'lang_op1_car2',1,'03','baseicon.png','ыва',16,'lan_op1_car2',NULL,100,4000,70,12,'2011-06-23 11:55:02.372000',NULL); INSERT INTO "GTS_vehicle" VALUES(3,'lang_sup_car1',1,'0000','baseicon.png','Fiat',16,'lan_sup_car1',NULL,100,4000,70,12,'2011-06-23 12:32:09.017000',NULL); INSERT INTO "GTS_vehicle" VALUES(4,'lang_sup_car2',1,'123','baseicon.png','ЗАЗ',16,'lan_sup_car2',NULL,100,4000,70,12,'2011-06-23 12:31:38.108000',NULL); INSERT INTO "GTS_vehicle" VALUES(9,'lang_op2_car1',1,'','baseicon.png','',16,'1233211234',NULL,100,4000,70,12,'2011-07-05 13:32:09.865000',NULL); INSERT INTO "GTS_vehicle" VALUES(11,'Big RIder',1,'','baseicon.png','0311523',16,'111',NULL,100,4000,70,20,'2011-07-07 12:12:40.358000',NULL); COMMIT; 

С помощью iterdump () вся информация будет отображаться следующим образом:

 INSERT INTO "name" VALUES(1, 'John') INSERT INTO "name" VALUES(2, 'Jane') INSERT INTO "phone" VALUES(1, '111000') INSERT INTO "phone" VALUES(2, '111001') 

Простым способом является фильтрация определенных ключевых слов методом string.startswith (). Например, имя таблицы – «телефон»:

 # Convert file existing_db.db to SQL dump file dump.sql import sqlite3, os con = sqlite3.connect('existing_db.db') with open('dump.sql', 'w') as f: for line in con.iterdump(): if line.startswith('INSERT INTO "phone"'): f.write('%s\n' % line) 

Не очень умный, но может соответствовать вашей цели.

Interesting Posts

Я продолжаю получать следующую ошибку django.db.utils.ProgrammingError: столбец «имя» отношения «blog_post» уже существует в моем приложении django

Ошибка импорта с помощью cPickle в Python

Частично прозрачный график рассеяния, но с сплошной цветной полосой

Как сказать distutils использовать gcc?

Почему переменные значения в Python перечисляет один и тот же объект?

Рисование огромного графика с помощью networkX и matplotlib

Почему peewee, включая столбец «id» в запросе select mysql?

странная ошибка python. что здесь происходит?

переносить модули python в pyspark на другие узлы?

Как использовать список (или кортеж) как значение форматирования строки

C массив для PyArray

Использует ли джанго юг (инструмент миграции) для innodb?

python: подсчет количества гласных или согласных во входном слове пользователя

Получение числа элементов в итераторе в Python

Возможно ли что-то вроде lvalue perl или setf lisp в python?

Python - лучший язык программирования в мире.