[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")