bravaorm


Namebravaorm JSON
Version 0.0.29 PyPI version JSON
download
home_pagehttps://github.com/robertons/bravaorm
SummaryPython ORM for MySQL
upload_time2024-09-24 20:11:19
maintainerNone
docs_urlNone
authorRoberto Neves
requires_pythonNone
licenseMIT
keywords orm datamodel database model entity sdk mysql mariadb
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            




# Brava ORM para MySQL/MariaDB

SDK fornece uma série de recursos para aumentar produtividade no desenvolvimento de aplicações com integração a banco de dados relacional MySql/MariaDB.

# Instalação

Instalação utilizando Pip

```bash
pip install bravaorm
```

Git/Clone
```
git clone https://github.com/robertons/bravaorm
cd bravaorm
pip install -r requirements.txt
python setup.py install
```


## Dados de Entrada

| entrada     | default |    tipo     | obrigatório |                  |
|-------------|---------|-------------|-------------|------------------|
| db_user     | None    | string      | sim         | Nome Usuário     |
| db_password | None    | string      | sim         | Senha Usuario    |
| db_host     | None    | string      | sim         | Host             |
| db_port     | None    | string      | sim         | Porta            |
| db_database | None    | string      | sim         | Nome DB          |
| db_ssl      | False   | boolean     | não         | Conexão Segura   |
| db_ssl_ca   | None    | string      | não         | Certificado CA   |
| db_ssl_cert | None    | string      | não         | Certificado      |
| db_ssl_key  | None    | string      | não         | Chave Certificado|
| db_charset  | utf8    | string      | não         | Charset DB       |
| log_level   | error   | string      | não         | Nível log        |

##  Saída

| método       | aplicável 		    |    resultado 					  			
|--------------|--------------------|--------------------------------------------
| first    	   |  Conexão           | objeto de um select     
| all    	   |  Conexão           | lista de objetos de um select|
| fetch   	   |  Conexão           | lista  de um select sem conversão em objeto
| delete(*obj*)| Conexão    		| exclui um objeto
| save()  	   | Conexão    		| salva operações no db
| add(*obj*)   | Objeto, Conexão    | adiciona objeto a uma lista/tabela
| ToJSON()     | Objeto, Conexão    | resultado em formato dict


## Conexão com Banco de dados

```python
import bravaorm

conn = bravaorm.Connection(db_user="root", db_password="pass", db_host="host", db_port=3306, db_database="dbmae", db_charset="utf8mb4")

```

## Gerando Modelo de Entidade

```python

import os
import bravaorm

bravaorm.Make(dir = os.path.dirname(os.path.abspath(__file__)), db_user="user", db_password="pass", db_host="host", db_port=3306, db_database="dbname")

```

> O script acima irá gerar na raiz do projeto as classes objetos baseados no Banco de Dados. As tabelas do banco dedos devem seguir os requisitos de pluralização, conforme exemplo abaixo:

```bash
.
├── ...
├── model                           # Raiz Entidade
│   ├── __init__.py          
│   ├── categoria.py               # Classe Categoria | Tabela categorias
│   ├── cliente.py                 # Classe Cliente  	| Tabela clientes
│   └── compra.py                  # Classe Compra  	| Tabela compras
│   └── produto.py                 # Classe Produto  	| Tabela produtos
└── ...
```

Tomando como exemplo a tabela produtos, a classe gerada estará assim:

```python
# -*- coding: utf-8 -*-
from bravaorm.entity import *

class Produto(Entity):

	def __init__(cls, **kw):
		cls.__metadata__ = {'pk': ['id']}

		cls.id = Int(pk=True, auto_increment=True, not_null=True, precision=10, scale=0)
		cls.id_categoria = Int(fk=True, not_null=True, precision=10, scale=0)
		cls.prod_nome = String(max=155)
		cls.prod_preco = Decimal(not_null=True, precision=19, scale=2)
		cls.prod_data_fabricacao = DateTime(format='%d/%m/%Y')
		cls.prod_data_modificacao = DateTime(format='%d/%m/%Y HH:MM:SS')

		# One-to-One
		cls.categorias = Obj(context=cls, keyname='categorias', name='Categoria', key='id', reference='id_categoria', table='categorias')

		# One-to-many
		cls.compras = ObjList(context=cls, keyname='compras',name='Compra', key='id_compra', reference='id', table='compras')

		super().__init__(**kw)
```


# Seleção de Objetos e Condições

```python
produto = conn.produtos.where("id=10").first
print(produto)
print(produto.toJSON())
```

**> <model.produto.Produto object at 0x101237c10>**

**> {'id': 10, 'id_categoria': 10, 'prod_nome': 'Exemplo', 'prod_preco':  Decimal('99.90'), 'prod_data_fabricacao': datetime(2010, 12, 10, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 03, 31, 16, 54, 22)}**

# Condição 'Ou'

A condição orwhere é dependente de condição where, e cria novos blocos a cada utilização.

```python
produtos = conn.produtos.where("id=10").orwhere("id=12").orwhere("id=14").all
print(produtos.toJSON())
```
**> [{'id': 10, 'id_categoria': 10,  'prod_nome': 'Exemplo', 'prod_preco':  Decimal('99.90'), 'prod_data_fabricacao': datetime(2010, 12, 10, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 03, 31, 16, 54, 22)}, {'id': 12, 'prod_nome': 'Outro Exemplo ', 'prod_preco':  Decimal('88,20'), 'prod_data_fabricacao': datetime(2011, 10, 8, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 02, 12, 10, 24, 20)}, {'id': 14, 'prod_nome': 'Novo Exemplo', 'prod_preco':  Decimal('129,90'), 'prod_data_fabricacao': datetime(2009, 11, 7, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 01, 10, 14, 34, 15)}]**

# Seleção de Campos
```python
produto = conn.produtos.where("id=10").select("id, prod_nome").first
print(produto.toJSON())
```
**> {'id': 10, 'prod_nome': 'Exemplo'}**

# Alias de Funções ou Campos
```python
produto = conn.produtos.alias('prod_nome','nome').where("id=10").first
print(produto['nome'])
print(produto.prod_nome)
```
**> Exemplo**
**> Exemplo**

*Alias são campos não editáveis*

# Ordenamento


```python
# ORDERBY
produto = conn.produtos.orderby("prod_nome").all
produto = conn.produtos.orderby("prod_nome DESC").all

```
# Agrupamento

```python
# GROUPBY
produto = conn.produtos.groupby("id_categoria").all
```

# Limite

```python
# LIMIT
produto = conn.produtos.orderby("prod_nome").limit(0,10).all

```

# União de Objetos

O métodos "join" e "inner" são recomendados para uso de objetos com relacionamento "um para um",  ou em casos onde o resultado da tabela secundária irá retornar apenas **um resultado.** A utilização desses métodos em casos de seleção "um para vários" o resultado será baseado na tabela secundária, podendo ocorrer a repetição do objeto principal. Neste neste caso é recomendável a utilização do método "include" onde o resultado da lista será com objetos únicos incluindo os vários resultados da tabela secundária.

**Exemplos:**

## Join

O método join, é equivalente ao "LEFT JOIN" e retorna o objeto principal incluindo a seleção secundária, de duas tabelas.

```python
produto = conn.produtos.join("categegorias").all

```

**> {'id': 10, 'id_categoria': 10, 'prod_nome': 'Exemplo', 'prod_preco':  Decimal('99.90'), 'prod_data_fabricacao': datetime(2010, 12, 10, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 03, 31, 16, 54, 22), 'categorias': {'id':1, 'cat_nome':'Categoria Teste'}}**


## Inner

O método inner, é equivalente ao "INNER JOIN" e retorna o objeto principal baseado na interceção da tabela secundária.

```python
produto = conn.produtos.inner("categorias").where("categorias.id=1").all

```

**> [{'id': 10, 'id_categoria': 10, 'prod_nome': 'Exemplo', 'prod_preco':  Decimal('99.90'), 'prod_data_fabricacao': datetime(2010, 12, 10, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 03, 31, 16, 54, 22), 'categorias': {'id':1, 'cat_nome':'Categoria Teste'}}, {'id': 12, 'prod_nome': 'Outro Exemplo ', 'prod_preco':  Decimal('88,20'), 'prod_data_fabricacao': datetime(2011, 10, 8, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 02, 12, 10, 24, 20), 'categorias': {'id':1, 'cat_nome':'Categoria Teste'}}, {'id': 14, 'prod_nome': 'Novo Exemplo', 'prod_preco':  Decimal('129,90'), 'prod_data_fabricacao': datetime(2009, 11, 7, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 01, 10, 14, 34, 15), 'categorias': {'id':1, 'cat_nome':'Categoria Teste'}}]**

## Include

O método include, faz seleção de um ou vários objetos relacionados ao objeto principal, recomendado para relacionamento um para vários.

*este método requer atenção em relação a performance para grandes seleções*

```python
produto = conn.produtos.include("compras").where("id=10, compras.compra_paga=1").all

```

**> [{'id': 10, 'id_categoria': 10, 'prod_nome': 'Exemplo', 'prod_preco':  Decimal('99.90'), 'prod_data_fabricacao': datetime(2010, 12, 10, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 03, 31, 16, 54, 22), 'compras': [{'id':1, 'compra_data':datetime(2010, 12, 10, 0, 0, 0), 'id_cliente':12}, {'id':23, 'compra_data':datetime(2017, 11, 13, 0, 0, 0), 'id_cliente':54}, {'id':34, 'compra_data':datetime(2018, 1 11, 0, 0, 0), 'id_cliente':20}, {'id':110, 'compra_data':datetime(2019, 7, 22, 0, 0, 0), 'id_cliente':16}]}]**

## ON

O método on, é possibilidade de escritas de join personalizados com tabelas sem relacionamentos. É possível escrever qualquer condição,  "RIGHT, INNER, LEFT JOIN" e retorna o objeto principal com os campos em alias de acordo com a tabela incluída.

O método possui 4 parametros de entrada, select ( campos da tabela selecionada), metodo join (left, right, inner), tabela e condição

No exemplo abaixo, selecionamos produtos com cupons de desconto, onde o preço do produto atinge o limite do preço do cumpom

```python
produto = conn.produtos.on("cupons.cod_cupom, cupons.cup_preco_max", "left", "cupons" , "cupons.cup_preco_max >= produtos.prod_preco").where("NOT cupons.id IS NULL").all

```

**> {'id': 10, 'id_categoria': 10, 'prod_nome': 'Exemplo', 'prod_preco':  Decimal('99.90'), 'prod_data_fabricacao': datetime(2010, 12, 10, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 03, 31, 16, 54, 22), 'cod_cupom': 'ACAFS' ,'cup_preco_max': Decimal(19,00)}**


#  Fetch

O método fetch  permite o obter a resposta direta do DB em formato dict a partir de um select, sem a conversão dos dados em classe/objeto. Este método oferece ganho significativo de performance.

```python
# GROUPBY
produtos = conn.produtos.fetch

```

**> [{'id': 10, 'prod_nome': 'Exemplo', 'prod_preco':  Decimal('99.90'), 'prod_data_fabricacao': datetime(2010, 12, 10, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 03, 31, 16, 54, 22)}, {'id': 12, 'prod_nome': 'Outro Exemplo ', 'prod_preco':  Decimal('88,20'), 'prod_data_fabricacao': datetime(2011, 10, 8, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 02, 12, 10, 24, 20)}, {'id': 14, 'prod_nome': 'Novo Exemplo', 'prod_preco':  Decimal('129,90'), 'prod_data_fabricacao': datetime(2009, 11, 7, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 01, 10, 14, 34, 15)}]**

## Método toJSON()

O metodo toJSON() retorna o objeto ou lista de resultado em formato dict.

```python
	print(produto)
	print(produto.toJSON())
```
**> <model.produto.Produto object at 0x107737c10>**

**> {'id': 10, 'prod_nome': 'Exemplo', 'prod_preco':  Decimal('99.90'), 'prod_data_fabricacao': datetime(2010, 12, 10, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 03, 31, 16, 54, 22)}**


# Criação de Objetos
## Simples
```python
from model import *

produto = Produto()
produto.prod_nome = 'Exemplo'
produto.prod_preco = Decimal('99.90')
produto.prod_data_fabricacao = datetime(2010, 12, 10, 0, 0, 0)
produto.prod_data_modificacao = '31/03/2021 16:54:22' # Conversão para datetime seguindo formato '%d/%m/%Y HH:MM:SS'

conn.add(produto)
conn.save()

```

**OU**

```python
from model import *

produto = Produto(prod_nome='Exemplo', prod_preco=Decimal('99.90'), prod_data_fabricacao = datetime(2010, 12, 10, 0, 0, 0), prod_data_modificacao = '31/03/2021 16:54:22')

conn.add(produto)
conn.save()
```

**OU**

```python
from model import *

produto = Produto(**{prod_nome:'Exemplo', prod_preco:Decimal('99.90'), prod_data_fabricacao:datetime(2010, 12, 10, 0, 0, 0), prod_data_modificacao :'31/03/2021 16:54:22'})

conn.add(produto)
conn.save()
```

## Com Relacionamentos

No exemplo abaixo, criamos um produto na tabela *produtos* com 3 fotos na tabela *produtos_fotos*

```python
from model import *

produto = Produto()
produto.prod_nome = 'Exemplo'
produto.prod_preco = Decimal('99.90')
produto.prod_data_fabricacao = datetime(2010, 12, 10, 0, 0, 0)
produto.prod_data_modificacao = '31/03/2021 16:54:22' # Conversão para datetime seguindo formato '%d/%m/%Y HH:MM:SS'

foto = ProdutoFoto()
foto.foto_descricao = 'Vista Frontal'
foto.foto_arquivo =  'fronta.jpg'
produto.produtos_fotos.add(foto)

foto = ProdutoFoto(**{foto_descricao:'Vista Lateral', foto_arquivo:'lateral.jpg'})
produto.produtos_fotos.add(foto)

produto.produtos_fotos.add(ProdutoFoto(foto_descricao='Vista Lateral', foto_arquivo='lateral.jpg'))

conn.add(produto)
conn.save()

```

# Atualizando Objeto

```python
produto = conn.produtos.where("id=10").first
produto.prod_preco = Decimal(89.90)
conn.add(produto).save()
```
**ou vários**

```python
produtos = db.produtos.where("prod_preco>=100").all
for produto in produtos:
	produto.prod_preco = produto.prod_preco * 0.9
	conn.add(produto)
db.save()
```

**ou relativos**

```python
categoria = db.categorias.include("produtos").where("id=1, produtos.pro_preco>=100").all
for produto in categoria.produtos:
	produto.prod_preco = produto.prod_preco * 0.9
	conn.add(produto)
db.save()
```

# Exclusão de Objetos

O método requer um objeto de entrada, ou uma condição where definida:

```python
conn.delete(produto).save()
```
ou condicional

```python
conn.produtos.where("prod_preco=100").delete()
```

# Contador

```python
quantidade_produtos = conn.produtos.where("prod_preco=100").count

print(quantidade_produtos)
```

**> 113 **

# Update Query

Realizar Atualização de registros com condição.


Atualizando um campo
```python
conn.produtos.where("prod_active=0").set("prod_active", 1)
```

Atualizando um ou mais campos

```python
conn.produtos.where("prod_active=0").update(**{"prod_active": 1, "prod_promo": 1})
```

OU

```python
conn.produtos.where("prod_active=0").update(prod_active=1, prod_promo=0)
```

# Execute Query

É possível executar queries mais complexas e com condicionais específicas, nesse caso é possível escrever a query diretamente na conexão e informar qual o tipo de objeto será retornado a partir dela.

A definição do objeto é opcional.



```python
produtos = conn.execute("SELECT * FROM produtos WHERE preco > 100", "Produto")
```

A consulta acima irá retornar uma lista de  objetos *Produto*


```python
produtos = conn.execute("SELECT * FROM produtos WHERE preco > 100")
```

A consulta acima irá retornar uma lista com dictionary  com dados de produtos



## License

MIT

Copyright (c) 2019-2021 Roberto Neves. All rights reserved. info (at) robertonsilva@gmail.com



            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/robertons/bravaorm",
    "name": "bravaorm",
    "maintainer": null,
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": null,
    "keywords": "orm, datamodel, database, model, entity, sdk, mysql, mariadb",
    "author": "Roberto Neves",
    "author_email": "robertonsilva@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/12/a1/1c002ee347fe09d6b1a5d0ebd2e27ce3ee0e08a05b9ac4675bdb27996c59/bravaorm-0.0.29.tar.gz",
    "platform": null,
    "description": "\n\n\n\n\n# Brava ORM para MySQL/MariaDB\n\nSDK fornece uma s\u00e9rie de recursos para aumentar produtividade no desenvolvimento de aplica\u00e7\u00f5es com integra\u00e7\u00e3o a banco de dados relacional MySql/MariaDB.\n\n# Instala\u00e7\u00e3o\n\nInstala\u00e7\u00e3o utilizando Pip\n\n```bash\npip install bravaorm\n```\n\nGit/Clone\n```\ngit clone https://github.com/robertons/bravaorm\ncd bravaorm\npip install -r requirements.txt\npython setup.py install\n```\n\n\n## Dados de Entrada\n\n| entrada     | default |    tipo     | obrigat\u00f3rio |                  |\n|-------------|---------|-------------|-------------|------------------|\n| db_user     | None    | string      | sim         | Nome Usu\u00e1rio     |\n| db_password | None    | string      | sim         | Senha Usuario    |\n| db_host     | None    | string      | sim         | Host             |\n| db_port     | None    | string      | sim         | Porta            |\n| db_database | None    | string      | sim         | Nome DB          |\n| db_ssl      | False   | boolean     | n\u00e3o         | Conex\u00e3o Segura   |\n| db_ssl_ca   | None    | string      | n\u00e3o         | Certificado CA   |\n| db_ssl_cert | None    | string      | n\u00e3o         | Certificado      |\n| db_ssl_key  | None    | string      | n\u00e3o         | Chave Certificado|\n| db_charset  | utf8    | string      | n\u00e3o         | Charset DB       |\n| log_level   | error   | string      | n\u00e3o         | N\u00edvel log        |\n\n##  Sa\u00edda\n\n| m\u00e9todo       | aplic\u00e1vel \t\t    |    resultado \t\t\t\t\t  \t\t\t\n|--------------|--------------------|--------------------------------------------\n| first    \t   |  Conex\u00e3o           | objeto de um select     \n| all    \t   |  Conex\u00e3o           | lista de objetos de um select|\n| fetch   \t   |  Conex\u00e3o           | lista  de um select sem convers\u00e3o em objeto\n| delete(*obj*)| Conex\u00e3o    \t\t| exclui um objeto\n| save()  \t   | Conex\u00e3o    \t\t| salva opera\u00e7\u00f5es no db\n| add(*obj*)   | Objeto, Conex\u00e3o    | adiciona objeto a uma lista/tabela\n| ToJSON()     | Objeto, Conex\u00e3o    | resultado em formato dict\n\n\n## Conex\u00e3o com Banco de dados\n\n```python\nimport bravaorm\n\nconn = bravaorm.Connection(db_user=\"root\", db_password=\"pass\", db_host=\"host\", db_port=3306, db_database=\"dbmae\", db_charset=\"utf8mb4\")\n\n```\n\n## Gerando Modelo de Entidade\n\n```python\n\nimport os\nimport bravaorm\n\nbravaorm.Make(dir = os.path.dirname(os.path.abspath(__file__)), db_user=\"user\", db_password=\"pass\", db_host=\"host\", db_port=3306, db_database=\"dbname\")\n\n```\n\n> O script acima ir\u00e1 gerar na raiz do projeto as classes objetos baseados no Banco de Dados. As tabelas do banco dedos devem seguir os requisitos de pluraliza\u00e7\u00e3o, conforme exemplo abaixo:\n\n```bash\n.\n\u251c\u2500\u2500 ...\n\u251c\u2500\u2500 model                           # Raiz Entidade\n\u2502   \u251c\u2500\u2500 __init__.py          \n\u2502   \u251c\u2500\u2500 categoria.py               # Classe Categoria | Tabela categorias\n\u2502   \u251c\u2500\u2500 cliente.py                 # Classe Cliente  \t| Tabela clientes\n\u2502   \u2514\u2500\u2500 compra.py                  # Classe Compra  \t| Tabela compras\n\u2502   \u2514\u2500\u2500 produto.py                 # Classe Produto  \t| Tabela produtos\n\u2514\u2500\u2500 ...\n```\n\nTomando como exemplo a tabela produtos, a classe gerada estar\u00e1 assim:\n\n```python\n# -*- coding: utf-8 -*-\nfrom bravaorm.entity import *\n\nclass Produto(Entity):\n\n\tdef __init__(cls, **kw):\n\t\tcls.__metadata__ = {'pk': ['id']}\n\n\t\tcls.id = Int(pk=True, auto_increment=True, not_null=True, precision=10, scale=0)\n\t\tcls.id_categoria = Int(fk=True, not_null=True, precision=10, scale=0)\n\t\tcls.prod_nome = String(max=155)\n\t\tcls.prod_preco = Decimal(not_null=True, precision=19, scale=2)\n\t\tcls.prod_data_fabricacao = DateTime(format='%d/%m/%Y')\n\t\tcls.prod_data_modificacao = DateTime(format='%d/%m/%Y HH:MM:SS')\n\n\t\t# One-to-One\n\t\tcls.categorias = Obj(context=cls, keyname='categorias', name='Categoria', key='id', reference='id_categoria', table='categorias')\n\n\t\t# One-to-many\n\t\tcls.compras = ObjList(context=cls, keyname='compras',name='Compra', key='id_compra', reference='id', table='compras')\n\n\t\tsuper().__init__(**kw)\n```\n\n\n# Sele\u00e7\u00e3o de Objetos e Condi\u00e7\u00f5es\n\n```python\nproduto = conn.produtos.where(\"id=10\").first\nprint(produto)\nprint(produto.toJSON())\n```\n\n**> <model.produto.Produto object at 0x101237c10>**\n\n**> {'id': 10, 'id_categoria': 10, 'prod_nome': 'Exemplo', 'prod_preco':  Decimal('99.90'), 'prod_data_fabricacao': datetime(2010, 12, 10, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 03, 31, 16, 54, 22)}**\n\n# Condi\u00e7\u00e3o 'Ou'\n\nA condi\u00e7\u00e3o orwhere \u00e9 dependente de condi\u00e7\u00e3o where, e cria novos blocos a cada utiliza\u00e7\u00e3o.\n\n```python\nprodutos = conn.produtos.where(\"id=10\").orwhere(\"id=12\").orwhere(\"id=14\").all\nprint(produtos.toJSON())\n```\n**> [{'id': 10, 'id_categoria': 10,  'prod_nome': 'Exemplo', 'prod_preco':  Decimal('99.90'), 'prod_data_fabricacao': datetime(2010, 12, 10, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 03, 31, 16, 54, 22)}, {'id': 12, 'prod_nome': 'Outro Exemplo ', 'prod_preco':  Decimal('88,20'), 'prod_data_fabricacao': datetime(2011, 10, 8, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 02, 12, 10, 24, 20)}, {'id': 14, 'prod_nome': 'Novo Exemplo', 'prod_preco':  Decimal('129,90'), 'prod_data_fabricacao': datetime(2009, 11, 7, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 01, 10, 14, 34, 15)}]**\n\n# Sele\u00e7\u00e3o de Campos\n```python\nproduto = conn.produtos.where(\"id=10\").select(\"id, prod_nome\").first\nprint(produto.toJSON())\n```\n**> {'id': 10, 'prod_nome': 'Exemplo'}**\n\n# Alias de Fun\u00e7\u00f5es ou Campos\n```python\nproduto = conn.produtos.alias('prod_nome','nome').where(\"id=10\").first\nprint(produto['nome'])\nprint(produto.prod_nome)\n```\n**> Exemplo**\n**> Exemplo**\n\n*Alias s\u00e3o campos n\u00e3o edit\u00e1veis*\n\n# Ordenamento\n\n\n```python\n# ORDERBY\nproduto = conn.produtos.orderby(\"prod_nome\").all\nproduto = conn.produtos.orderby(\"prod_nome DESC\").all\n\n```\n# Agrupamento\n\n```python\n# GROUPBY\nproduto = conn.produtos.groupby(\"id_categoria\").all\n```\n\n# Limite\n\n```python\n# LIMIT\nproduto = conn.produtos.orderby(\"prod_nome\").limit(0,10).all\n\n```\n\n# Uni\u00e3o de Objetos\n\nO m\u00e9todos \"join\" e \"inner\" s\u00e3o recomendados para uso de objetos com relacionamento \"um para um\",  ou em casos onde o resultado da tabela secund\u00e1ria ir\u00e1 retornar apenas **um resultado.** A utiliza\u00e7\u00e3o desses m\u00e9todos em casos de sele\u00e7\u00e3o \"um para v\u00e1rios\" o resultado ser\u00e1 baseado na tabela secund\u00e1ria, podendo ocorrer a repeti\u00e7\u00e3o do objeto principal. Neste neste caso \u00e9 recomend\u00e1vel a utiliza\u00e7\u00e3o do m\u00e9todo \"include\" onde o resultado da lista ser\u00e1 com objetos \u00fanicos incluindo os v\u00e1rios resultados da tabela secund\u00e1ria.\n\n**Exemplos:**\n\n## Join\n\nO m\u00e9todo join, \u00e9 equivalente ao \"LEFT JOIN\" e retorna o objeto principal incluindo a sele\u00e7\u00e3o secund\u00e1ria, de duas tabelas.\n\n```python\nproduto = conn.produtos.join(\"categegorias\").all\n\n```\n\n**> {'id': 10, 'id_categoria': 10, 'prod_nome': 'Exemplo', 'prod_preco':  Decimal('99.90'), 'prod_data_fabricacao': datetime(2010, 12, 10, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 03, 31, 16, 54, 22), 'categorias': {'id':1, 'cat_nome':'Categoria Teste'}}**\n\n\n## Inner\n\nO m\u00e9todo inner, \u00e9 equivalente ao \"INNER JOIN\" e retorna o objeto principal baseado na interce\u00e7\u00e3o da tabela secund\u00e1ria.\n\n```python\nproduto = conn.produtos.inner(\"categorias\").where(\"categorias.id=1\").all\n\n```\n\n**> [{'id': 10, 'id_categoria': 10, 'prod_nome': 'Exemplo', 'prod_preco':  Decimal('99.90'), 'prod_data_fabricacao': datetime(2010, 12, 10, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 03, 31, 16, 54, 22), 'categorias': {'id':1, 'cat_nome':'Categoria Teste'}}, {'id': 12, 'prod_nome': 'Outro Exemplo ', 'prod_preco':  Decimal('88,20'), 'prod_data_fabricacao': datetime(2011, 10, 8, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 02, 12, 10, 24, 20), 'categorias': {'id':1, 'cat_nome':'Categoria Teste'}}, {'id': 14, 'prod_nome': 'Novo Exemplo', 'prod_preco':  Decimal('129,90'), 'prod_data_fabricacao': datetime(2009, 11, 7, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 01, 10, 14, 34, 15), 'categorias': {'id':1, 'cat_nome':'Categoria Teste'}}]**\n\n## Include\n\nO m\u00e9todo include, faz sele\u00e7\u00e3o de um ou v\u00e1rios objetos relacionados ao objeto principal, recomendado para relacionamento um para v\u00e1rios.\n\n*este m\u00e9todo requer aten\u00e7\u00e3o em rela\u00e7\u00e3o a performance para grandes sele\u00e7\u00f5es*\n\n```python\nproduto = conn.produtos.include(\"compras\").where(\"id=10, compras.compra_paga=1\").all\n\n```\n\n**> [{'id': 10, 'id_categoria': 10, 'prod_nome': 'Exemplo', 'prod_preco':  Decimal('99.90'), 'prod_data_fabricacao': datetime(2010, 12, 10, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 03, 31, 16, 54, 22), 'compras': [{'id':1, 'compra_data':datetime(2010, 12, 10, 0, 0, 0), 'id_cliente':12}, {'id':23, 'compra_data':datetime(2017, 11, 13, 0, 0, 0), 'id_cliente':54}, {'id':34, 'compra_data':datetime(2018, 1 11, 0, 0, 0), 'id_cliente':20}, {'id':110, 'compra_data':datetime(2019, 7, 22, 0, 0, 0), 'id_cliente':16}]}]**\n\n## ON\n\nO m\u00e9todo on, \u00e9 possibilidade de escritas de join personalizados com tabelas sem relacionamentos. \u00c9 poss\u00edvel escrever qualquer condi\u00e7\u00e3o,  \"RIGHT, INNER, LEFT JOIN\" e retorna o objeto principal com os campos em alias de acordo com a tabela inclu\u00edda.\n\nO m\u00e9todo possui 4 parametros de entrada, select ( campos da tabela selecionada), metodo join (left, right, inner), tabela e condi\u00e7\u00e3o\n\nNo exemplo abaixo, selecionamos produtos com cupons de desconto, onde o pre\u00e7o do produto atinge o limite do pre\u00e7o do cumpom\n\n```python\nproduto = conn.produtos.on(\"cupons.cod_cupom, cupons.cup_preco_max\", \"left\", \"cupons\" , \"cupons.cup_preco_max >= produtos.prod_preco\").where(\"NOT cupons.id IS NULL\").all\n\n```\n\n**> {'id': 10, 'id_categoria': 10, 'prod_nome': 'Exemplo', 'prod_preco':  Decimal('99.90'), 'prod_data_fabricacao': datetime(2010, 12, 10, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 03, 31, 16, 54, 22), 'cod_cupom': 'ACAFS' ,'cup_preco_max': Decimal(19,00)}**\n\n\n#  Fetch\n\nO m\u00e9todo fetch  permite o obter a resposta direta do DB em formato dict a partir de um select, sem a convers\u00e3o dos dados em classe/objeto. Este m\u00e9todo oferece ganho significativo de performance.\n\n```python\n# GROUPBY\nprodutos = conn.produtos.fetch\n\n```\n\n**> [{'id': 10, 'prod_nome': 'Exemplo', 'prod_preco':  Decimal('99.90'), 'prod_data_fabricacao': datetime(2010, 12, 10, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 03, 31, 16, 54, 22)}, {'id': 12, 'prod_nome': 'Outro Exemplo ', 'prod_preco':  Decimal('88,20'), 'prod_data_fabricacao': datetime(2011, 10, 8, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 02, 12, 10, 24, 20)}, {'id': 14, 'prod_nome': 'Novo Exemplo', 'prod_preco':  Decimal('129,90'), 'prod_data_fabricacao': datetime(2009, 11, 7, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 01, 10, 14, 34, 15)}]**\n\n## M\u00e9todo toJSON()\n\nO metodo toJSON() retorna o objeto ou lista de resultado em formato dict.\n\n```python\n\tprint(produto)\n\tprint(produto.toJSON())\n```\n**> <model.produto.Produto object at 0x107737c10>**\n\n**> {'id': 10, 'prod_nome': 'Exemplo', 'prod_preco':  Decimal('99.90'), 'prod_data_fabricacao': datetime(2010, 12, 10, 0, 0, 0), 'prod_data_modificacao': 'datetime(2021, 03, 31, 16, 54, 22)}**\n\n\n# Cria\u00e7\u00e3o de Objetos\n## Simples\n```python\nfrom model import *\n\nproduto = Produto()\nproduto.prod_nome = 'Exemplo'\nproduto.prod_preco = Decimal('99.90')\nproduto.prod_data_fabricacao = datetime(2010, 12, 10, 0, 0, 0)\nproduto.prod_data_modificacao = '31/03/2021 16:54:22' # Convers\u00e3o para datetime seguindo formato '%d/%m/%Y HH:MM:SS'\n\nconn.add(produto)\nconn.save()\n\n```\n\n**OU**\n\n```python\nfrom model import *\n\nproduto = Produto(prod_nome='Exemplo', prod_preco=Decimal('99.90'), prod_data_fabricacao = datetime(2010, 12, 10, 0, 0, 0), prod_data_modificacao = '31/03/2021 16:54:22')\n\nconn.add(produto)\nconn.save()\n```\n\n**OU**\n\n```python\nfrom model import *\n\nproduto = Produto(**{prod_nome:'Exemplo', prod_preco:Decimal('99.90'), prod_data_fabricacao:datetime(2010, 12, 10, 0, 0, 0), prod_data_modificacao :'31/03/2021 16:54:22'})\n\nconn.add(produto)\nconn.save()\n```\n\n## Com Relacionamentos\n\nNo exemplo abaixo, criamos um produto na tabela *produtos* com 3 fotos na tabela *produtos_fotos*\n\n```python\nfrom model import *\n\nproduto = Produto()\nproduto.prod_nome = 'Exemplo'\nproduto.prod_preco = Decimal('99.90')\nproduto.prod_data_fabricacao = datetime(2010, 12, 10, 0, 0, 0)\nproduto.prod_data_modificacao = '31/03/2021 16:54:22' # Convers\u00e3o para datetime seguindo formato '%d/%m/%Y HH:MM:SS'\n\nfoto = ProdutoFoto()\nfoto.foto_descricao = 'Vista Frontal'\nfoto.foto_arquivo =  'fronta.jpg'\nproduto.produtos_fotos.add(foto)\n\nfoto = ProdutoFoto(**{foto_descricao:'Vista Lateral', foto_arquivo:'lateral.jpg'})\nproduto.produtos_fotos.add(foto)\n\nproduto.produtos_fotos.add(ProdutoFoto(foto_descricao='Vista Lateral', foto_arquivo='lateral.jpg'))\n\nconn.add(produto)\nconn.save()\n\n```\n\n# Atualizando Objeto\n\n```python\nproduto = conn.produtos.where(\"id=10\").first\nproduto.prod_preco = Decimal(89.90)\nconn.add(produto).save()\n```\n**ou v\u00e1rios**\n\n```python\nprodutos = db.produtos.where(\"prod_preco>=100\").all\nfor produto in produtos:\n\tproduto.prod_preco = produto.prod_preco * 0.9\n\tconn.add(produto)\ndb.save()\n```\n\n**ou relativos**\n\n```python\ncategoria = db.categorias.include(\"produtos\").where(\"id=1, produtos.pro_preco>=100\").all\nfor produto in categoria.produtos:\n\tproduto.prod_preco = produto.prod_preco * 0.9\n\tconn.add(produto)\ndb.save()\n```\n\n# Exclus\u00e3o de Objetos\n\nO m\u00e9todo requer um objeto de entrada, ou uma condi\u00e7\u00e3o where definida:\n\n```python\nconn.delete(produto).save()\n```\nou condicional\n\n```python\nconn.produtos.where(\"prod_preco=100\").delete()\n```\n\n# Contador\n\n```python\nquantidade_produtos = conn.produtos.where(\"prod_preco=100\").count\n\nprint(quantidade_produtos)\n```\n\n**> 113 **\n\n# Update Query\n\nRealizar Atualiza\u00e7\u00e3o de registros com condi\u00e7\u00e3o.\n\n\nAtualizando um campo\n```python\nconn.produtos.where(\"prod_active=0\").set(\"prod_active\", 1)\n```\n\nAtualizando um ou mais campos\n\n```python\nconn.produtos.where(\"prod_active=0\").update(**{\"prod_active\": 1, \"prod_promo\": 1})\n```\n\nOU\n\n```python\nconn.produtos.where(\"prod_active=0\").update(prod_active=1, prod_promo=0)\n```\n\n# Execute Query\n\n\u00c9 poss\u00edvel executar queries mais complexas e com condicionais espec\u00edficas, nesse caso \u00e9 poss\u00edvel escrever a query diretamente na conex\u00e3o e informar qual o tipo de objeto ser\u00e1 retornado a partir dela.\n\nA defini\u00e7\u00e3o do objeto \u00e9 opcional.\n\n\n\n```python\nprodutos = conn.execute(\"SELECT * FROM produtos WHERE preco > 100\", \"Produto\")\n```\n\nA consulta acima ir\u00e1 retornar uma lista de  objetos *Produto*\n\n\n```python\nprodutos = conn.execute(\"SELECT * FROM produtos WHERE preco > 100\")\n```\n\nA consulta acima ir\u00e1 retornar uma lista com dictionary  com dados de produtos\n\n\n\n## License\n\nMIT\n\nCopyright (c) 2019-2021 Roberto Neves. All rights reserved. info (at) robertonsilva@gmail.com\n\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Python ORM for MySQL",
    "version": "0.0.29",
    "project_urls": {
        "Homepage": "https://github.com/robertons/bravaorm"
    },
    "split_keywords": [
        "orm",
        " datamodel",
        " database",
        " model",
        " entity",
        " sdk",
        " mysql",
        " mariadb"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "12a11c002ee347fe09d6b1a5d0ebd2e27ce3ee0e08a05b9ac4675bdb27996c59",
                "md5": "79dd99e059bc0e083e3dd61d7b212090",
                "sha256": "ccf72afb41374d49f529bedfe0b1d07f8fb8be1cfd643e8ce0f0d2914686978f"
            },
            "downloads": -1,
            "filename": "bravaorm-0.0.29.tar.gz",
            "has_sig": false,
            "md5_digest": "79dd99e059bc0e083e3dd61d7b212090",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 33237,
            "upload_time": "2024-09-24T20:11:19",
            "upload_time_iso_8601": "2024-09-24T20:11:19.144325Z",
            "url": "https://files.pythonhosted.org/packages/12/a1/1c002ee347fe09d6b1a5d0ebd2e27ce3ee0e08a05b9ac4675bdb27996c59/bravaorm-0.0.29.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-09-24 20:11:19",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "robertons",
    "github_project": "bravaorm",
    "github_not_found": true,
    "lcname": "bravaorm"
}
        
Elapsed time: 0.71456s