Обработка сложных операторов SQL с помощью Python и SQLAlchemy - PullRequest
0 голосов
/ 16 ноября 2018

Я создаю аналитическую страницу, подкрепленную Python (Flask) и Redshift в качестве источника данных.Данные представлены в стартовой схеме, поэтому все, что я хочу сделать, - это базовая агрегация и фильтрация в заданный период времени (звучит не так, как в ракетостроении).Хотя я не могу найти какой-либо элегантный способ сделать это.

Допустим, у меня есть SQL-запрос, который хорошо предоставляет ежедневную статистику за текущий месяц.

with current_month as (
    select date
    from date_d 
    where month_name = 'November' AND year_actual = '2018'
    order by date
),
filtered as (
    select date ,fact.id, fact.created_id,
    from fact
    join date_d ON date_d.id = fact.created_id
    where date_d.month_name = 'November' AND date_d.year_actual = '2018' AND fact.foo = 'bar'
),
total as (
    SELECT COUNT(id),DATE(date) 
    from filtered GROUP BY 2),

SELECT current_month.date, COALESCE(total.count,0) as total
from current_month
LEFT JOIN total ON current_month.date = total.date
group by 1,
order by current_month.date

Могу ли я как-нибудьвыполнить этот запрос и загрузить результаты в некоторую предопределенную структуру данных?Я посмотрел на SQLAlchemy, потому что мне не хотелось выполнять необработанные SQL-запросы, но ORM здесь выглядит бесполезным.Похоже, единственный способ - выполнить сырой SQL и загрузить его в какую-то схему (используя зефир).Я посмотрел на эту статью , которая близка, но не настолько сложна.

Может быть, я что-то упустил?Люди должны делать такие вещи довольно часто.Или, может быть, мой подход неверен во всем?

PS Простая фильтрация отлично работает на моей схеме с Flask-Restless

1 Ответ

0 голосов
/ 16 ноября 2018

Попробуйте Pandas и Pyodbc:

import pandas as pd
import pyodbc

server = 'mysrvr'
db = 'mydb'
conn = pyodbc.connect('DRIVER={SQL Server};SERVER='+server+';DATABASE='+db+';Trusted_Connection=yes')

sql = "select col1, col2, col3 from mytable"

my_dataframe = pd.read_sql(sql,conn)

my_dataframe будет вашим фреймом данных / структурой данных.

...