You are currently viewing Как скопировать определение таблицы в MySQL с помощью Python?

Как скопировать определение таблицы в MySQL с помощью Python?

Python требует интерфейса для доступа к серверу баз данных. Python поддерживает широкий спектр интерфейсов для взаимодействия с различными базами данных. Для связи с базой данных MySQL используется модуль Python MySQL Connector, API, написанный исключительно на Python. Этот модуль самодостаточен, что означает, что он не имеет зависимостей и требует только стандартной библиотеки Python.

Копирование определения таблицы в SQL:

С помощью инструкций CREATE и SELECT можно скопировать определение и данные из существующей таблицы в новую таблицу.

Синтаксис:

CREATE TABLE new_table AS  
SELECT * FROM original_table;

Здесь содержимое существующей таблицы (original_table) копируется в новую таблицу (new_table). Инструкция CREATE создает новую таблицу со структурой, определенной инструкцией SELECT, и заполняет новую таблицу выбранными столбцами (* указывает, что выбраны все столбцы).

Примечание. Объекты базы данных, связанные с исходной таблицей, такие как индексы, ключевые ограничения и т.д., Не дублируются.

Для копирования таблицы вместе с ее зависимыми объектами базы данных используются операторы CREATE, LIKE и INSERT.

Синтаксис:

CREATE TABLE new_table  
LIKE original_table; 
INSERT new_table  
SELECT * FROM original_table;

Во-первых, инструкция CREATE создает новую таблицу (new_table), имеющую ту же структуру и зависимые объекты, что и существующая таблица (original_table). Затем оператор INSERT заполняет новую таблицу значениями, выбранными из исходной таблицы. Простое использование инструкции CREATE без ВСТАВКИ создаст пустую таблицу, имеющую структуру и зависимые объекты существующей таблицы.

Шаги с использованием Python:

  1. Установите соединение с сервером базы данных и создайте объект курсора.
  2. Используйте объект курсора для выполнения инструкций CREATE-SELECT или CREATE-LIKE-INSERT для копирования таблицы.
  3. Проверьте, было ли скопировано определение таблицы.

Давайте рассмотрим несколько примеров для лучшего понимания.

Используемая база данных:

Мы будем использовать базу данных магазина с таблицей товаров, описывающей товары и доступные запасы.

Пример 1:

Скопируйте определение таблицы с помощью инструкции CREATE-SELECT

Используйте функцию connect() для установления соединения с сервером базы данных и используйте функцию cursor() для создания объекта курсора. С помощью этого объекта курсора выполните инструкцию CREATE-SELECT для создания копии новой таблицы запасов таблицы продуктов с помощью функции execute (). Чтобы проверить, имеет ли вновь созданная таблица то же определение таблицы, что и исходная, используйте инструкцию DESC для описания структуры и инструкцию SELECT для проверки содержимого таблицы.

# Import required packages
import mysql.connector

# Establish connection to MySQL database
db = mysql.connector.connect(
	host = "localhost",
	user = "username",
	password = "geeksforgeeks",
	database = "store"
)

# Create a cursor object
cursor = db.cursor()

# MySQL query for copying existing table,
# selecting new table data and
# describing new table structure
queries = "CREATE TABLE inventory1 AS SELECT * FROM products;\
		DESC inventory1;"
	
# Execute the query
results = cursor.execute(queries, multi = True)

# Print data and description of newly created table
for result in results:
	if result.with_rows:
		for row in result:
			print(row)
			
# Close database connection
db.close()

Выход:

Все значения из таблицы «Продукты» копируются в таблицу «Запасы«. Структура, то есть типы данных и столбцы, сохраняются. Однако объекты базы данных, такие как ограничение первичного ключа prod_id, не сохраняются.

Пример 2: 

Скопируйте определение таблицы без содержимого таблицы с помощью инструкции CREATE-SELECT

Используйте тот же код для установления соединения и проверки, что и в приведенном выше примере. Чтобы просто скопировать определение таблицы, а не содержимое, добавьте предложение WHERE в инструкцию SELECT таким образом, чтобы оно возвращало пустой набор и никакие значения не копировались следующим образом.

# Import required packages
import mysql.connector

# Establish connection to MySQL database
db = mysql.connector.connect(
	host="localhost",
	user="username",
	password="geeksforgeeks",
	database="store"
)

# Create a cursor object
cursor = db.cursor()

# MySQL queries for copying existing table
# without copying its data,
# selecting new table data and
# describing new table structure
queries = "CREATE TABLE inventory2 AS \
		SELECT * FROM products \
		WHERE 1=0; \
		DESC inventory2;"

# Execute the query
results = cursor.execute(queries, multi=True)

# Print data and description of newly created table
for result in results:
	if result.with_rows:
		for row in result:
			print(row)

# Close database connection
db.close()

Условие 1 = 0 в запросе CREATE-SELECT всегда принимает значение false. Таким образом, запрос возвращает пустую таблицу, создавая новую пустую таблицу запасов с той же структурой, что и в существующей таблице продуктов.

Выход:

Пример 3: 

Скопируйте определение таблицы и зависимые объекты базы данных с помощью инструкции CREATE-LIKE

Используйте тот же код для установления соединения и проверки, что и в примере 1. Чтобы скопировать таблицу со всеми ее зависимыми объектами и содержимым, используйте инструкцию CREATE-LIKE-INSERT, как показано ниже.

# Import required packages
import mysql.connector

# Establish connection to MySQL database
db = mysql.connector.connect(
	host="localhost",
	user="username",
	password="geeksforgeeks",
	database="store"
)

# Create a cursor object
cursor = db.cursor()

# MySQL queries for copying existing table,
# selecting new table data and
# describing new table structure
queries = "CREATE TABLE inventory3 LIKE products; \
		INSERT inventory3 SELECT * FROM products;\
		DESC inventory3;"
	
# Execute the query
results = cursor.execute(queries, multi = True)

# Print data and description of newly created table
for result in results:
	if result.with_rows:
		for row in result:
			print(row)
			
# Close database connection
db.close()

Выход:

Обратите внимание, что ограничение первичного ключа prod_id сохраняется.

Пример 4: 

Скопируйте определение таблицы и зависимые объекты без табличных данных с помощью инструкции CREATE-LIKE

Используйте тот же код для установления соединения и проверки, что и в примере 1. Чтобы просто скопировать определение таблицы, а не содержимое, удалите инструкцию INSERT, как показано ниже.

# Import required packages
import mysql.connector

# Establish connection to MySQL database
db = mysql.connector.connect(
	host="localhost",
	user="username",
	password="geeksforgeeks",
	database="store"
)

# Create a cursor object
cursor = db.cursor()

# MySQL queries for copying existing table
# without copying its data,
# selecting new table data and
# describing new table structure
queries = "CREATE TABLE inventory4 LIKE products; \
		DESC inventory4;"

# Execute the query
results = cursor.execute(queries, multi=True)

# Print data and description of newly created table
for result in results:
	if result.with_rows:
		for row in result:
			print(row)

# Close database connection
db.close()

Выход: