Загрузка данных
import pyodbc
# Настройки подключения
# Подставьте имя вашего сервера (например: 'localhost', '127.0.0.1', '.\SQLEXPRESS' или имя ПК)
SERVER = 'localhost'
DB_NAME = 'CompanyDB'
DRIVER = '{ODBC Driver 17 for SQL Server}'
def get_connection(db_name=None):
"""Создает подключение к SQL Server. Если db_name не указан, подключаемся к master."""
conn_str = f'DRIVER={DRIVER};SERVER={SERVER};'
if db_name:
conn_str += f'DATABASE={db_name};'
# Используем Windows Authentication (Trusted_Connection=yes).
# Для SQL Server Authentication замените на: 'UID=sa;PWD=your_password;'
conn_str += 'Trusted_Connection=yes;'
return pyodbc.connect(conn_str)
def create_database_and_table():
"""Создание базы данных и таблицы 'Employees'."""
# Для CREATE DATABASE вызов commit недопустим, включаем autocommit=True
conn = get_connection()
conn.autocommit = True
cursor = conn.cursor()
# Создаем БД, если она не существует
cursor.execute(f"""
IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'{DB_NAME}')
BEGIN
CREATE DATABASE [{DB_NAME}];
END
""")
conn.close()
# Подключаемся к созданной БД и создаем таблицу
conn = get_connection(DB_NAME)
cursor = conn.cursor()
cursor.execute("""
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Employees]') AND type in (N'U'))
BEGIN
CREATE TABLE Employees (
EmployeeID INT IDENTITY(1,1) PRIMARY KEY,
FirstName NVARCHAR(50) NOT NULL,
LastName NVARCHAR(50) NOT NULL,
Position NVARCHAR(50),
Salary DECIMAL(10, 2)
);
END
""")
conn.commit()
conn.close()
# ==================== CRUD ОПЕРАЦИИ ====================
def create_employee(first_name, last_name, position, salary):
"""[C]reate — Добавление нового сотрудника"""
conn = get_connection(DB_NAME)
cursor = conn.cursor()
sql = """
INSERT INTO Employees (FirstName, LastName, Position, Salary)
VALUES (?, ?, ?, ?)
"""
cursor.execute(sql, (first_name, last_name, position, salary))
conn.commit()
# Получаем ID вставленной записи
cursor.execute("SELECT @@IDENTITY AS LastID")
new_id = cursor.fetchone()[0]
conn.close()
print(f"[CREATE] Добавлен сотрудник #{new_id}: {first_name} {last_name}")
return new_id
def read_employees(emp_id=None):
"""[R]ead — Чтение всех сотрудников или конкретного по ID"""
conn = get_connection(DB_NAME)
cursor = conn.cursor()
if emp_id:
cursor.execute("SELECT EmployeeID, FirstName, LastName, Position, Salary FROM Employees WHERE EmployeeID = ?", (emp_id,))
row = cursor.fetchone()
conn.close()
if row:
print(f"[READ] Сотрудник #{row.EmployeeID}: {row.FirstName} {row.LastName} | Должность: {row.Position} | З/П: {row.Salary}")
return row
else:
print(f"[READ] Сотрудник с ID {emp_id} не найден.")
return None
else:
cursor.execute("SELECT EmployeeID, FirstName, LastName, Position, Salary FROM Employees")
rows = cursor.fetchall()
conn.close()
print(f"\n--- Список всех сотрудников ({len(rows)}) ---")
for r in rows:
print(f"ID: {r.EmployeeID} | {r.FirstName} {r.LastName} | Должность: {r.Position} | З/П: {r.Salary}")
return rows
def update_employee_salary(emp_id, new_salary):
"""[U]pdate — Обновление зарплаты сотрудника"""
conn = get_connection(DB_NAME)
cursor = conn.cursor()
sql = "UPDATE Employees SET Salary = ? WHERE EmployeeID = ?"
cursor.execute(sql, (new_salary, emp_id))
conn.commit()
affected = cursor.rowcount
conn.close()
if affected > 0:
print(f"[UPDATE] Зарплата сотрудника #{emp_id} обновлена до {new_salary}")
else:
print(f"[UPDATE] Запись с ID {emp_id} не найдена.")
def delete_employee(emp_id):
"""[D]elete — Удаление сотрудника"""
conn = get_connection(DB_NAME)
cursor = conn.cursor()
sql = "DELETE FROM Employees WHERE EmployeeID = ?"
cursor.execute(sql, (emp_id,))
conn.commit()
affected = cursor.rowcount
conn.close()
if affected > 0:
print(f"[DELETE] Сотрудник #{emp_id} удален.")
else:
print(f"[DELETE] Запись с ID {emp_id} не найдена.")
# ==================== ДЕМОНСТРАЦИЯ РАБОТЫ ====================
if __name__ == "__main__":
# 1. Инициализация базы данных и таблицы
create_database_and_table()
# 2. CREATE (Добавление записей)
id1 = create_employee("Иван", "Иванов", "Разработчик", 120000.00)
id2 = create_employee("Анна", "Смирнова", "Аналитик", 95000.00)
# 3. READ (Просмотр)
read_employees() # Показать всех
read_employees(id1) # Показать конкретного
# 4. UPDATE (Изменение)
update_employee_salary(id1, 135000.00)
read_employees(id1)
# 5. DELETE (Удаление)
delete_employee(id2)
read_employees() # Проверка итогового списка