Подключение к базам данных: библиотеки и примеры для Python

Раздел: Интеграция -> Работа с базами данных

Способы подключения к базам данных в Python

Как выполнить подключение к PostgreSQL с максимальной производительностью?

Для промышленного использования часто выбирают PostgreSQL в связке с библиотекой psycopg2. Это зрелый драйвер, поддерживающий пулы соединений, асинхронность через psycopg2.extras и расширенные типы данных.

import psycopg2

conn_params = {
    'dbname': 'mydb',
    'user': 'user',
    'password': 'secret',
    'host': 'localhost',
    'port': 5432
}

try:
    conn = psycopg2.connect(**conn_params)
    cur = conn.cursor()
    cur.execute("SELECT version();")
    print(cur.fetchone())
    cur.close()
    conn.close()
except psycopg2.OperationalError as e:
    print(f"Ошибка подключения: {e}")

создание базы данных на python (создание базы данных с помощью python)

После установки пакета (pip install psycopg2-binary) создаётся объект соединения. Для каждого запроса создаётся курсор. Закрытие соединения обязательно, иначе ресурсы базы останутся занятыми.

Типичная проблема: psycopg2.OperationalError возникает при неверных учётных данных, недоступности сервера или превышении числа подключений. Решение – проверить параметры подключения и настроить max_connections в PostgreSQL.

Ещё одна распространённая ошибка: забыть закрыть курсор или соединение. Используйте контекстный менеджер:

with psycopg2.connect(**conn_params) as conn:
    with conn.cursor() as cur:
        cur.execute(...)

база данных на python (база данных на python)

Этот вариант подходит для высоконагруженных систем, где важна скорость выполнения запросов и прямой контроль над транзакциями.

Как подключиться к SQLite без установки дополнительных пакетов?

Модуль sqlite3 входит в стандартную библиотеку Python. Он идеален для прототипирования, локального хранения и тестов.

import sqlite3

conn = sqlite3.connect('example.db')  # база создаётся автоматически
cur = conn.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)")
cur.execute("INSERT INTO users (name) VALUES ('Alice')")
conn.commit()
cur.execute("SELECT * FROM users")
print(cur.fetchall())
conn.close()

Python интерфейс базы данных (интерфейс базы данных в python)

Если файл базы не существует, он будет создан. Для работы в памяти используйте ':memory:'.

Частая проблема – блокировка файла при нескольких одновременных записях. SQLite поддерживает только одну пишущую транзакцию. Для многопользовательских приложений лучше перейти на клиент-серверную СУБД.

Случай использования: встраиваемые системы, мобильные приложения, аналитические скрипты.

Как интегрировать MySQL через официальный коннектор?

Библиотека mysql-connector-python позволяет подключаться к MySQL/MariaDB.

import mysql.connector

config = {
    'user': 'root',
    'password': 'pass',
    'host': '127.0.0.1',
    'database': 'testdb'
}
conn = mysql.connector.connect(**config)
cur = conn.cursor()
cur.execute("SELECT NOW()")
print(cur.fetchone()[0])
cur.close()
conn.close()

Fastapi python postgresql (работа с postgresql в fastapi)

Установка: pip install mysql-connector-python. Альтернатива – pymysql (чистый Python) или mysqlclient (более быстрый).

Ошибка mysql.connector.errors.DatabaseError может быть связана с неправильной кодировкой или превышением времени ожидания. Рекомендуется задать charset='utf8mb4' и настроить connect_timeout.

Подходит для веб-приложений на MySQL.

Как абстрагироваться от конкретной СУБД с помощью SQLAlchemy?

SQLAlchemy предоставляет единый интерфейс для работы с разными базами данных, поддерживая Core (низкоуровневый SQL) и ORM (объектно-реляционное отображение).

from sqlalchemy import create_engine, text

# PostgreSQL
engine = create_engine('postgresql+psycopg2://user:pass@localhost/mydb')
# SQLite
# engine = create_engine('sqlite:///example.db')

with engine.connect() as conn:
    result = conn.execute(text("SELECT 1"))
    print(result.fetchone())

таблица sql python (создание таблиц в sql через python)

Установка: pip install sqlalchemy (и драйвер БД, например psycopg2). URL подключения задаётся строкой dialect+driver://....

Проблема: путаница в синтаксисе URL. Например, для MySQL: mysql+mysqlconnector://user:pass@host/db. Неверный драйвер приводит к ImportError.

Используется в проектах, где требуется часто менять БД (тесты, разработка, продакшен).

Как выполнять асинхронные запросы к базе?

Для современного асинхронного кода (asyncio) применяются библиотеки aiosqlite (SQLite) и asyncpg (PostgreSQL).

import asyncio
import aiosqlite

async def main():
    async with aiosqlite.connect('test.db') as db:
        async with db.execute("SELECT 42") as cursor:
            row = await cursor.fetchone()
            print(row[0])

asyncio.run(main())

Для PostgreSQL: asyncpg требует отдельной установки и работает только с asyncio.

Частая ошибка: попытка использовать асинхронный драйвер в синхронном коде или наоборот. Асинхронные соединения не поддерживают блокирующие вызовы.

Подходит для высоконагруженных веб-серверов на aiohttp или FastAPI.

Расширенные примеры работы с базами данных

1. Пул соединений в psycopg2

Для уменьшения накладных расходов на создание соединений используется пул. Библиотека psycopg2.pool предоставляет ThreadedConnectionPool и SimpleConnectionPool.

Пример
from psycopg2.pool import SimpleConnectionPool

pool = SimpleConnectionPool(1, 10, user='user', password='pass', host='localhost', dbname='mydb')

# Получить соединение из пула
with pool.getconn() as conn:
    with conn.cursor() as cur:
        cur.execute("SELECT current_database();")
        print(f"Подключено к {cur.fetchone()[0]}")
# Соединение автоматически возвращается в пул

pool.closeall()
Подключено к mydb

Параметры: minconn (минимальное количество соединений), maxconn (максимальное). Пул потокобезопасен.

2. Транзакции с явным контролем

Управление транзакциями вручную полезно для сложных операций.

Пример
import sqlite3

conn = sqlite3.connect(':memory:')
cur = conn.cursor()

try:
    cur.execute("CREATE TABLE accounts (id INTEGER PRIMARY KEY, balance REAL)")
    cur.execute("INSERT INTO accounts VALUES (1, 1000.0)")
    cur.execute("INSERT INTO accounts VALUES (2, 500.0)")
    
    # Начало транзакции (автоматически при первом DML)
    cur.execute("UPDATE accounts SET balance = balance - 200 WHERE id = 1")
    cur.execute("UPDATE accounts SET balance = balance + 200 WHERE id = 2")
    conn.commit()  # Фиксация изменений
    print("Перевод выполнен успешно")
except Exception as e:
    conn.rollback()  # Откат при ошибке
    print(f"Ошибка: {e}")
finally:
    conn.close()
Перевод выполнен успешно

Если один из UPDATE вызовет ошибку, все изменения откатятся.

3. Использование ORM в SQLAlchemy

Пример объявления модели и запроса через ORM.

Пример
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import declarative_base, sessionmaker

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))

engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)

Session = sessionmaker(bind=engine)
session = Session()

user = User(name='Bob')
session.add(user)
session.commit()

# Запрос
result = session.query(User).filter_by(name='Bob').first()
print(f"ID: {result.id}, Name: {result.name}")
session.close()
ID: 1, Name: Bob

ORM автоматически генерирует SQL, скрывая диалектные особенности.

4. Асинхронное подключение к PostgreSQL через asyncpg

Пример с выполнением запроса и получением результатов.

Пример
import asyncio
import asyncpg

async def main():
    conn = await asyncpg.connect(user='user', password='pass',
                                 database='test', host='localhost')
    values = await conn.fetch('SELECT * FROM generate_series(1, 3)')
    for row in values:
        print(f"Число: {row[0]}")
    await conn.close()

asyncio.run(main())
Число: 1
Число: 2
Число: 3

asyncpg работает напрямую с asyncio, не блокируя event loop.

5. Подключение к MySQL с обработкой всех возможных исключений

Пример
import mysql.connector
from mysql.connector import errorcode

try:
    conn = mysql.connector.connect(
        host='localhost',
        database='testdb',
        user='root',
        password='',
        connection_timeout=5
    )
    cur = conn.cursor()
    cur.execute("SELECT 1+1")
    result = cur.fetchone()
    print(f"Результат: {result[0]}")
except mysql.connector.InterfaceError as err:
    print(f"Ошибка интерфейса: {err}")
except mysql.connector.DatabaseError as err:
    print(f"Ошибка базы данных: {err}")
except Exception as e:
    print(f"Общая ошибка: {e}")
finally:
    if 'conn' in locals() and conn.is_connected():
        cur.close()
        conn.close()
Результат: 2

Разделение исключений помогает точнее диагностировать проблемы.

Подключение к базе данных в Python - comments

En
подключение к бд python (python)