Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя

Как читать SQL таблицы через Pandas?

ПрограммированиеData science+3
Анонимный вопрос
Data Science
  · 2,5 K
Data engineer, пишу на python, люблю sqlalchemy, иногда копаюсь в data science  · 18 сент 2022
Приветствую🖐
Вопрос интересный и крайне простой. Для чтения SQL в Pandas есть только 1 метод - read_sql.
Тут нужно немного прояснить: Pandas самостоятельно не читает таблицы, а выполняет SQL запросы с помощью указанного соединения с БД. То есть сформировать запрос необходимо самостоятельно - это важно.
Сделать при помощи Pandas так:
import pandas as pd

pd.read_sql_table(name="super_metric_table")
невозможно. Pandas может сделать только так:
query = """SELECT * FROM super_metric_table;"""
pd.read_sql(query)
Ниже рассмотрим минимально необходимое, чтобы выполнить SQL запрос при помощи Pandas:
  1. Параметры соединения с БД (в различных вариантах могут быть: логин\пароль, порт и ip адресс, SSL сертификат или просто путь до файла с БД, если используется SQLite)
  2. Объект соединения с базой - так называемый engine, который и выполняет непосредственно запрос
  3. Непосредственно текст запроса. В Python - это многострочный комментарий, например, так:
query = """
SELECT *
FROM table t
WHERE t.age > 75
LIMIT 10;
"""
  1. И метод reasd_sql  как удобный интерфейс для всего выше.
Например, если локально установить PostgreSQL и запустить, то параметры соединения могут быть такими:
user = "admin"
pass = "my_super_pass_2022"
port = 5432 # стандартный порт PostgreSQL
ip = 'localhost' # тк база на вашем компьютере
db = 'my_db'
Если используется SQLite, то вашим параметром будет путь до файла, например, /home/user/data/my_db.db .
Далее из параметров нужно сформировать объект engine, для унификации лучше всегда использовать sqlalchemy. Ниже пример создания:
from sqlalchemy import create_engine

# PostgreSQL
engine = create_engine('postgresql://admin:my_super_pass_2022@localhost:5432/my_db')

# sqlite
engine = create_engine("sqlite:////home/user/my_db.db")
Строка подключения эта 'postgresql://admin:my_super_pass_2022@localhost:5432/my_db' или эта "sqlite:////home/user/my_db.db" называется connection uri.
Далее пишем наш запрос и передаем все параметры в метод read_sql, полный код выполнения SQL выглядит так:
import pandas as pd
from sqlalchemy import create_engine

# PostgreSQL
engine = create_engine('postgresql://admin:my_super_pass_2022@localhost:5432/my_db')

query = """
SELECT *
FROM table t
WHERE t.age > 75
LIMIT 10;
"""

df = pd.read_sql(query, con=engine)
В результате в переменной df будет ждать результат выполнения запроса в виде pd.DataFrame. 
Какие особенности есть еще:
  • в некоторых СУБД есть схемы, их можно указывать в дополнительных аргументах метода read_sql или непосредственно в тексте запроса
  • возможны дополнительные параметры для конкретной СУБД, например, подключение к Oracle будет несколько иным 🙃
  • любые другие настройки работы с бд можно указывать в engine (например, кодировку, часовой пояс, параметры сессии)
  • если работаете с SQLite и базы у вас нет, то при выполнении строки с созданием engine - база(файл) создасться автоматически
  • а как быть, если запросы писать не хочется🤷‍♂️ В этом случае необходимо ознакомиться с дополнительными ресурсами (sqlalchemy ORM, статья по основам)
  • в Jupyter-notebook можно использовать некоторую магию для удобства
Надеюсь маленький ликбез позволит читать таблицы SQL при помощи Pandas и укажет дальнейшее направление. Желаю успехов😎