Поскольку никто не ответил, вот мой дикий метод, который выполняет копирование: поскольку таблицы необходимо создавать по порядку (чтобы избежать ошибок ограничений FK), я должен определить упорядоченный список, содержащий каждую таблицу
Медленное и НЕ надежное решение:
allTables = ["tableA",
"tableB", # <table B points to FK constraint of tableA>
"tableC", # <table C points to FK constraint of tableB>
...]
def copyAllContent():
global allTables
s = Session(bind=origEngine) # session bind to original table
se = Session(bind=op.get_bind()) # session bind to cloned table (currently empty)
try:
for table in allTables:
# print(table)
rows = s.query(Base.classes._data[table]).all()
for row in rows:
local_object = se.merge(row) #merging both sessions
se.add(local_object)
se.commit()
except Exception as e:
print(e)
Вышеуказанный метод работал для большинства таблиц, но не для всех.например, таблица router
существовала в исходной базе данных, но все равно я получаю ошибки в s.query(Base.classes._data[table]).all()
ключ с именем router
не существует.У нас нет достаточно времени, чтобы найти решение для этого.
БЫСТРОЕ и надежное решение:
Позже я нашел отсюда другое БЫСТРОЕ и тихое надежное решение с использованием mysqldump
#copy sql dump from x database
mysqldump --column-statistics=0 -P 8000 -h localhost -u root -p --hex-blob x > x_dump.sql
Приведенная выше команда командной строки mysqldump
создает файл дампа sql с именем x_dump.sql
, который содержит все необходимые сценарии SQL, необходимые для повторного создания базы данных.Теперь все, что нам нужно сделать, это применить этот файл дампа sql к другой базе данных y
#clone the database contents into y database
mysql -P 3306 -h localhost -u anum -p y < x_dump.sql
Вот питонская версия того же
import subprocess
#copy sql dump from x database - blocking call (use Popen for non-blocking)
print(subprocess.call(["mysqldump", "--column-statistics=0", '-P', '8000', '-h', 'localhost', '-u', '<user>', '-p<password>',
'--hex-blob', 'x', '>', 'x_dump.sql'], shell=True))
print("done taking dump.")
#clone the database contents into y database - blocking call
print(subprocess.call(["mysql", '-P', '3306', '-h', 'localhost', '-u', '<user>', '-p<password>',
'y', '<', 'x_dump.sql'], shell=True))
print("done cloning the sqlDump.")