Подключение к базам данных: библиотеки и примеры для 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
Разделение исключений помогает точнее диагностировать проблемы.