2016-09-07 3 views
0

Я хочу скопировать таблицу из другого файла db, но я терпеть неудачу, и я не могу понять почему. Это мой код:php sqlite - скопировать таблицу в другую базу данных

$db = new SQLite3($_SERVER['DOCUMENT_ROOT']."/db/098765.db"); 
$sql = "ATTACH DATABASE 'admin.db' AS admin ; 
     INSERT INTO 'table-1' SELECT * FROM 'admin.table-1';"; 
$db->query($sql); 

Я читал все вопросы по этой теме на этом сайте, но мне ничего не ответил.

Отсутствие полного пути к ATTACH DATABASE не работает. Создание таблицы перед вставкой данных также не работает.

+0

Вам нужно делать это через 'php'? – redneb

+0

Предпочтительно, но я открыт для любого решения. – Doe

ответ

0
  1. Правильно котировка идентификаторы объектов базы данных (имена таблиц/столбцов и т.д.) в вашем INSERT заявлении. Используйте только double quotes вместо одиночных, которые предназначены для строковых литералов. Лучше еще не использовать тире или другие ограниченные символы в именах объектов, если это возможно (придерживаться буквенно-цифровых символов и подчеркивания).

  2. Использование exec() вместо query()

$dbPath = $_SERVER['DOCUMENT_ROOT']; 
$adminDbPath = $dbPath; // Or something else 

$db = new SQLite3("$dbPath/db/098765.db"); 
$db->exec("ATTACH DATABASE '$adminDbPath/admin.db' AS admin"); 
$db->exec('INSERT INTO "table-1" SELECT * FROM admin."table-1"'); 
    ^^^^   ^ ^     ^ ^
+0

Предупреждение: SQLite3 :: exec(): нет такой таблицы: table-1 – Doe

+0

Вы не получите это предупреждающее сообщение, если вы правильно удвоили котировку имени таблицы '" table-1 "'. – peterm

+0

Я делал все точно так же, как вы писали. – Doe

1

sqlite3 инструмент командной строки имеет удобный команда называется .dump, что делает эту задачу тривиальной:

sqlite3 admin.db '.dump "table-1"' | sqlite3 098765.db 

Это создаст таблицу, все связанные индексы и, конечно же, скопируют все данные.

Редактировать: Для более общего решения, создать скрипт (назовем его copy-table.sh) следующим образом:

#!/bin/bash 
$src_db="$1" 
$dst_db="$2" 
$table="$3" 

sqlite3 "$src_db" ".dump \"$table\"" | sqlite3 "$dst_db" 

После этого вы можете выполнить скрипт следующим

./copy-table.sh 'admin.db' '098765.db' 'table-1' 

Очевидно , вы можете выполнить сценарий в любом случае, например, от cron или от php.

+0

Мне нужно, чтобы этот скрипт выполнялся автоматически. Возможно ли это с помощью средств командной строки? – Doe

+0

Да. Всегда ли это одна и та же таблица, т. Е. «Таблица-1» и те же базы данных? – redneb

+0

Нет, он отличается. – Doe

Смежные вопросы