[PITCH] ORM/Query Builder para Python

O Começo

Há 20 dias publiquei um conteúdo sobre um projeto que desenvolvi e uso dentro da minha empresa, se quiserem ver o post original:

https://www.tabnews.com.br/WilianZilv/criei-um-orm-em-python-para-minha-empresa

O pessoal que comentou achou bem legal a ideia e eu já estava animado para lançar como um pacote público e nesses últimos dias comecei a trabalhar na biblioteca e pensar em um nome (a parte mais difícil). Então aqui vai, o ORM para Python que eu chamei de "horsql".

A biblioteca foi publicada no pypi.org para fácil instalação: https://pypi.org/project/horsql/

Aqui está o respositório (seria legal ver esse projeto crescendo) https://github.com/WilianZilv/horsql

Uma breve documentação do "horsql"

Confira a (quase) completa documentação no README.md do repositório

A ideia é simplificar ao máximo consultas em SQL trabalhando diretamente com DataFrames do Pandas sem definir schemas/models previamente, utilizando as tabelas já existentes no banco de dados MYSQL/PostgreSQL.

Consultas

# todos os usuários
df = db.public.users.get()

# algumas colunas de usuários +18
df = db.public.users.get(columns=["user_name", "age"], age=o.EqualsOrGreaterThan(18))

# (group by) idade média por cidade no Brasil
df = db.public.users.get(columns=["city"], avg=["age"], country="Brazil")

# Ordenação
df = db.public.users.order_by("age", ascending=True).get()

# Limit
df = db.public.users.limit(limit=10).get()

# Paginação
df = db.public.users.paginate(page=1, page_size=10).get()

Inserindo/Atualizando dados

new_user = pd.DataFrame([
    {
        "user_name": "WilianZilv",
        "first_name": "Wilian",
        "last_name": "Silva"
    }
])

# Inserindo novos dados baseado no dataframe
db.public.users.create(new_user)

# Upsert
db.public.users.create(new_user, on_conflict=["user_name"], update=["city", "country"])

# Atualizando linhas no banco de dados
new_user["city"] = "Curitiba"
new_user["country"] = "Brazil"

db.public.users.update(new_user, on_conflict=["user_name"], update=["city", "country"])

# Deletando linhas
db.public.users.delete(user_name="WilianZilv")