Programacion Interactiva

Descubre una Nueva y Poderosa Herramienta.

FrameWork de Nueva Generacion

Acceso a tu Informacion desde cualquier Dispositivo con Navegador.

Enfoque en el Backend

Frontend de forma facil con Odoo y XML.

Creacion de Verticales

Creacion de nuevas Verticales Conquistando nuevos Mercados.

Tu marca aqui mismo

Llega a miles de personas.

Publicidad

Mostrando las entradas con la etiqueta postgresql. Mostrar todas las entradas
Mostrando las entradas con la etiqueta postgresql. Mostrar todas las entradas

miƩrcoles, 18 de julio de 2018

Mejorar DesempeƱo de Odoo 8, 9 ,10 y 11 con PostgreSQL 10

Odoo Consultants

Mejorar el DesempeƱo de Odoo y Optimizar Consultas a la Base


Con la llegada de PostgreSQL 10, el rendimiento de Odoo puede aumentar beneficiandose de las nuevas funcionalidades como las funciones de consultas paralelas. Desde el lado de PostgreSQL, esta es una excelente noticia porque esto significa que muchas consultas SELECT operadas del lado del ORM de Odoo se pueden ejecutar mas rapido de lo que solian ser. Dentro de las ventajas encontramos:

  • Resultados mas rapidos en las consultas ( PostgreSQL mejora el desempeƱo hasta 32 veces mas rapida la respues que en versiones como 9.5)
  • Mejora los modos de Indexacion GIN, BRIN y B-tree.
  • Mejora la compresión de filas y tablas.
Sin embargo, cuando miramos el desempeƱo de Odoo, debemos entender que Odoo no tiene la capacidad para  utilizar estas funcionalidades de forma eficiente, ya que lo anterior implica 2 factores principales que estan ausentes en Odoo:

  • Una estrategia de indexación evolucionada orientada de acuerdo a los contenidos (Odoo solo maneja el tipo B-tree como estandar)
  • Capacidad para optimizar el Analisis de Indexación ( debe hacerse del lado de PostgreSQL y no es accesible del lado de Odoo)
En general, el cambiar las versiones de anteriores de PostgreSQL para migrar a las nuevas versiones sin realizar ajustes adecuados en su motor de base de datos y sus modelos de datos no proporcionarƔ ninguna mejora visible en tƩrminos de rendimiento y tiempos de consulta / respuesta.

Puedes verificar la relevancia y efiniencia del Indice desde el lado de PostgreSQL ejecutando el siguiente escript:


SELECT
schemaname,
relname,
idx_scan,
seq_scan,
cast(idx_scan AS numeric) / (idx_scan + seq_scan) AS idx_scan_pct
FROM pg_stat_user_tables WHERE (idx_scan + seq_scan)>0 ORDER BY idx_scan_pct;
Esto ayudara a mejorar la eficiencia de la indexación  en comparación con la lectura secuencial. Por supuesto, la idea es reducir los escaneos secuenciales tanto como sean posible, ya que consumen mas recursos y generan mas bloqueos de tablas / memoria / consumo de Procesamiento (CPU).

Fuente de Consulta:

jueves, 17 de mayo de 2018

Duplicar Base de Datos en 5 Minutos Odoo y PostgreSQL

Duplicar una base de datos a nivel directorio Fisico PostgreSQL


Todas las Bases de Datos creadas en Postgres son guardadas en archivos y directorios del Sistema Operativo, utilizando un metodo sencillo podemos duplicar una Base de Datos a nivel fisico.

1. Creamos nuestra Base de Datos copia

Creamos nuestra Base de Datos Copia por medio de terminal.

sudo su postgres

createdb BASE_2 -O odoo10

2. Verificamos el Nombre del Directorio

El ID origen llamado OID en el template de postgres, es el nombre del directorio que contiene tu Base de Datos, es necesario conocerlo para poder duplicar nuestra Base de Datos.

Obtenemos el OID de la Base Origen

sudo su postgres

psql template1

select datname,oid from pg_database where datname like 'BASE_ORIGEN';

Obtenemos el OID de la Base Destino

sudo su postgres

psql template1

select datname,oid from pg_database where datname like 'BASE_2';

3. Nos colocamos en el directorio de Postgres

En este ejemplo estoy utilizando PostgreSQL 9.6 y el ejemplo que mostrare es la ubicacion de mis bases de datos.

cd /var/lib/postgresql/9.6/main/base


4. Duplicamos el Directorio de la Base Origen

Es Importante que este proceso lo hagamos con el usuario postgres del Sistema Operativo.

El primer Base es Eliminar el Directorio de nuestra Base 2

rm -r OID_BASE_2


Como paso final duplicamos el directorio de la Base Origen a la Base 2 

cp OID_ORIGEN OID_BASE_2


Listo, con estos sencillos pasos obtenemos una copia de nuestra Base de Datos de una forma rapida y sin esperar.

Nota Importante: Es importante tambien, duplicar el directorio de archivos binarios (data_dir) de tu base de datos origen con el nombre de tu base de datos destino.

lunes, 13 de febrero de 2017

Inserción de Datos a una nueva tabla desde una consulta SQL

Insertar Datos a una tabla Many2many desde una consulta SQL


Un problema que tuve al momento de generar una base de datos nueva y cargar un catalogo de productos fue que olvide activar una ruta creada, entonces me surgió una duda como puedo insertar datos a una tabla relacional producto de un campo many2many desde una consulta SQL sin usar funciones en la base de datos, pues la respuesta fue muy sencilla y a continuación les describo mi script:

insert into stock_route_product(product_id,route_id) select id as product_id,
5 as route_id from product_template;


  • Primero detectamos la tabla many2many2 que contiene la información por la cual se crean las relaciones.
  • Segundo ingresamos las 2 columnas que se necesitan para obtener la relación muchos a muchos, en mi caso la ruta que querĆ­a insertar era la que tenia el ID 5 para cada producto.
  • Por ultimo hice la consulta de la tabla product_template y de forma automĆ”tica PostreSQL inserto cada registro de la tabla mencionada y su relación correspondiente en la tabla de rutas.


Espero les sea de ayuda.


viernes, 27 de enero de 2017

Automatización de Respaldos de Bases de Datos Odoo desde Bash

Automatización de Respaldos en Odoo desde Bash



  1. Crear un Script (Backup-Script) en la Ruta /var/scripts/dump_db.sh
    #!/bin/sh    
    hostname='hostname'
    
    ##########################################
    ## Odoo Backup
    ## Respaldo de las Bases: odoodb1, odoob2
    ##########################################
    
    # Detener el Servicio de Odoo
    /etc/init.d/odoo-server stop
    
    # Dump DB (Backup de 2 Bases de Datos)
    for db in odoodb1 odoodb2
    do
      date='date +"%Y%m%d_%H%M%N"' # Respaldo con la fecha actual.
      filename="/var/pgdump/${hostname}_${db}_${date}.sql"
      pg_dump -E UTF-8 -p 5433 -F p -b -f $filename $db
      gzip $filename # Comprimiendo la Base de Datos
    done
    
    # Iniciando el servicio de Odoo nuevamente
    /etc/init.d/odoo-server start
    
    exit 0
    
  2. Script de Eliminación de los Backups, creamos un script en la ruta /var/scripts/housekeeping.sh (Solo borrara backups con una antiguedad de 30 dias para atras).
    #!/bin/sh
    path=/var/pgdump
    logfile=/var/log/$0
    
    rm -f $logfile
    for file in 'find /var/pgdump/ -mtime +30 -type f -name *.sql.gz'
    do
      echo "Borrando: " $file >> $logfile
      rm $file
    done
    
    exit 0 
  3. Programar la ejecucion de los scripts, modificamos el crontab en  /etc/crontab. La programación de los Backups se ejecutara a la 1 am y la limpieza de backups a las 5 am.
    # m h dom mon dow user  command
    0 1 * * * postgres /var/scripts/dump_db.sh
    0 5 * * * postgres /var/scripts/housekeeping.sh

Si queremos que nuestro Respaldo pese mucho menos podrĆ­amos comprimirlo con la librerĆ­a 7zip en lugar de gzip:



7zr a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=on Mi_Backup.7z /path/to/database.dump


Nota: La detención del proceso de Odoo, puede variar dependiendo la instalación que hayan realizado, podría ser simplemente service odoo stop/start o podemos matar el proceso directamente con sudo fuser -k 8069/tcp.

viernes, 14 de octubre de 2016

Forzar la Escritura de Base de Datos en Procesos Odoo

Forzar un Commit a la Base de Datos


    Muchos de nosotros en el ambiente de programación Odoo hemos notado una funcionalidad bastante interesante, poderosa y buena para evitar concurrencia de información basura en el Sistema y es la escritura a la Base de Datos mediante Odoo, durante la ejecución de una función (proceso) Odoo no realiza cambios en la Base de Datos hasta no terminar la ejecución correcta de la misma, si ocurre un error durante la ejecución Odoo hace un reverse a lo que se habĆ­a realizado anteriormente, asĆ­ evita que se guarde información basura o se llegaran a duplicar registros.
    Esto es muy Ćŗtil, pero en ocasiones llegamos a tener la necesidad de forzar la escritura a la Base de Datos ya sea por el tamaƱo de recursos del Servidor (Memoria RAM), por bloqueos generados por el Servidor PostgreSQL (max_locks_per_transaction) o simplemente queremos que cierta información recabada no se pierda, por ejemplo en la lectura de archivos binarios de una ruta x, que al ser procesados son eliminados del servidor, en este proceso no podemos perder la información ya generada, asĆ­ que podrĆ­amos forzar la escritura a la Base de Datos, otro ejemplo podria ser al generar reportes contables en donde la cantidad de información es en volĆŗmenes considerablemente grandes y la memoria podria saturarse.

Para forzar la escritura de la Base de Datos basta con insertar este pequeño fragmente de codigo en la parte de nuestro código donde queremos forzar la escritura:

self.env.cr.commit()

lunes, 10 de octubre de 2016

Instalación de Odoo 10 en CentOS 7




Instalación de Odoo 10 en 
CentOS 7

Instalación de Odoo 10 en un servidor CentOS 7 con GitHub. 

Instalación y Configuración de PostgreSQL 9.3

Primero que nada debemos instalar y descargar PostgreSQL del repositorio Oficial:
rpm -Uvh http://yum.postgresql.org/9.3/redhat/rhel-7-x86_64/pgdg-centos93-9.3-1.noarch.rpm  
yum -y install postgresql93 postgresql93-server postgresql93-devel --disablerepo=* --enablerepo=pgdg93  
El segundo paso es habilitar el Servidor PostgreSQL como un servicio del Sistema:
/usr/pgsql-9.3/bin/postgresql93-setup initdb
systemctl enable postgresql-9.3.service  
systemctl start postgresql-9.3  
Creamos un usuario postgres para nuestro servidor Odoo:
su - postgres -c "createuser -s odoo" 2> /dev/null || true  

Instalación de dependencias para Odoo

Necesitaremos instalar las herramientas necesarias:
yum -y groupinstall "Development tools"  
Para la instalación de las dependencias ejecutaremos en una terminal:
yum -y install subversion git bzr bzrtools postgresql python-all-dev python-dev python-setuptools libxml2-dev libxslt1-dev libevent-dev libsasl2-dev libldap2-dev pkg-config libtiff5-dev libjpeg8-dev libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev liblcms2-utils libwebp-dev tcl8.6-dev tk8.6-dev python-tk libyaml-dev fontconfig node-less python-pip gdebi-core python-dateutil python-feedparser python-ldap python-libxslt1 python-lxml python-mako python-openid python-psycopg2 python-pybabel python-pychart python-pydot python-pyparsing python-reportlab python-simplejson python-tz python-vatnumber python-vobject python-webdav python-werkzeug python-xlwt python-yaml python-zsi python-docutils python-psutil python-mock python-unittest2 python-jinja2 python-pypdf python-decorator python-requests python-passlib python-pil
Habilitaremos repositorios como EPEL:
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm  
rpm -ivh epel-release-7-5.noarch.rpm  
Instalación de Wkhtmltopdf:
yum --enablerepo=epel install wkhtmltopdf  
Instalación de la aplicación Python Pip, para el manejo de las librerías en Python:
yum --enablerepo=epel install python-pip  

Descarga de Odoo desde Repositorios Oficiales via GitHub

Clonamos el repositorio oficial en la ruta /opt/ :
git clone --branch 10.0 https://www.github.com/odoo/odoo /opt/odoo

Creación de una Virtual Env para Odoo

Un virtual env es un emulador de librerĆ­as Python, que nos permitirĆ” manejar librerĆ­as Python de forma independiente en una ruta especifica.

Creamos un nuevo usuario del Sistema, y lo asignamos como propietario de nuestro git clone Odoo /opt/directorio_odoo :
useradd odoo  
chown -R odoo: /opt/odoo  
su - odoo  
Ahora instalaremos las dependencias desde nuestro archivo requirements.txt, ubicado en la instalación de Odoo (requirements.txt):
/bin/virtualenv odoo
source odoo/bin/activate  
PATH=$PATH:/usr/pgsql-9.3/bin  
pip install -r /opt/odoo/requirements.txt  
exit  
Esperamos que finalice la descarga de los paquetes a nuestro entorno virtual.

Creación del Servicio Odoo (Systemctl)

Generamos el archivo odoo-server.conf:
cat > /etc/odoo-server.conf << EOF  
[options]
admin_passwd = admin  
db_host = False  
db_port = False  
db_user = odoo  
db_password = False  
addons_path = /opt/odoo/addons,/opt/odoo/odoo/addons
without-demo=all  
no-xmlrpc = True  
no-xmlrpcs = True  
no-netrpc = True  
log_db = False  
log_handler = ['[\'["[\\\':INFO\\\']"]\']']  
log_level = info  
logfile = False  
login_message = False  
logrotate = True  
syslog = False  
EOF  
Generamos el archivo odoo.service (systemctl):
cat > /usr/lib/systemd/system/odoo.service << EOF  
[Unit]
Description=Odoo 10.0 ERP and CRM server  
After=postgresql-9.3.service

[Service]
Type=simple  
User=odoo  
Group=odoo  
ExecStart=/home/odoo/odoo/bin/python /opt/odoo/odoo-bin --config=/etc/odoo-server.conf

[Install]
WantedBy=multi-user.target  
EOF  
Puedes usar el siguiente comando para visualizar el log de Odoo en tiempo real: journalctl -f -u odoo.

Pasos Finales

Necesitamos permitir el acceso de información del puerto 8069 en el firewall de CentOS:
firewall-cmd --zone=public --add-port=8069/tcp --permanent  
firewall-cmd --reload  
Finalmente iniciamos el Servicio de Odoo con los comandos:
systemctl enable odoo.service  
systemctl start odoo  
Listo, ahora visualizaremos en nuestro navegador: http://<ip_servidor>:8069


martes, 2 de agosto de 2016

Consultar las Tablas Relacionales Many2many en Odoo 9

Como encontrar las tablas resultantes de campos Many2many en Odoo 9



    Dentro de los muchos cambios que estamos observando en la API de odoo y para los que venimos de la programación de módulos en versiones inferiores a odoo (openerp) notamos una dificultad en los campos relacionales, en openerp 7 hacia abajo uno de los atributos que necesitabas para poder declarar un campo de tipo many2many era el nombre de la tabla relacion, por ejemplo la clase purchase.order (compras) y la relacion con account.invoice (facturas), esta relacion de tipo many2many estaba declarada de la siguiente manera:

'invoice_ids': fields.many2many('account.invoice',
               'purchase_invoice_rel', 
               'purchase_id', 'invoice_id', 
               'Invoices', help="Invoices generated for a purchase order"),

A simple vista identificamos la tabla resultante de la relación llamada purchase_invoice_rel.


En la API de odoo ya no es necesario indicar el nombre de la tabla relación, esta se creara de forma interna, aunque si nosotros la indicamos en la declaración del campo odoo respetara ese atributo. El mismo ejemplo anterior con la API de Odoo seria:

invoice_ids = fields.Many2many('account.invoice',
              compute="_compute_invoice", string='Invoices', copy=False)

A simple vista no podemos identificar la tabla resultante de la misma relación, para ello debemos consultar la tabla ir_model_relation  a nivel base de datos y buscarla de forma manual, es una tarea un poco mas compleja,pero al final nos ayudara un poco y nos evitara buscar en todo el codigo del modulo:

select * from ir_model_relation where name like '%order%'


Si queremos ver todas las relaciones creadas en nuestra Base de Datos:

select * from ir_model_relation order by name

Una alternativa es consultando los atributos del campo, en la tabla ir_model_fields:

select * from ir_model_fields where model = 'hr.employee.imss' and name='contract_ids'

Nota:
         Debemos asegurarnos que el campo que vayamos a consultar el modulo que lo contiene este instalado en la base de datos.

martes, 19 de julio de 2016

Cerrar Conexiones a una Base de Datos PostgreSQL

Matar sesiones conectadas a una base de datos (PostgreSQL)


    Para poder matar las conexiones que existan para una determinada base de datos enPostgreSQL, deberemos combinar la función pg_terminate_backend(pid) para matar la sesión con la tabla pg_stat_activity para obtener los pids de las conexiones a una determinada base de datos
     Mediante la tabla pg_stat_activity podemos filtrar por “datname” para obtener todos los pids (columna pid) de las conexiones a dicha base de datos, por lo que si lo combinamos con la función pg_terminate_backend() podremos matar todas las sesiones que usen dicha base de datos. 
Primero Debemos conectarnos al template predeterminado de nuestro Servidor PostgreSQL, por defecto template1:
sudo su postgres 
psql template1
El Query Final seria :
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'basededatos';

viernes, 10 de junio de 2016

Solucion de Error PostgreSQL Encoding Latin en lugar de UTF-8 y Unable to Login en Odoo


Cambiar Codificación Latin -> UTF-8 PostgreSQL & Odoo




    Este Error me causo conflicto al tratar de crear una Maquina Virtual para migrar una instancia de Odoo al instalar las dependencias que necesita este maravilloso ERP, el motor de Base de Datos (PostgreSQL) y por ultimo restablecer la Base de Datos, me di cuenta que no podĆ­a acceder a la base restablecida en la parte web me arrojaba el error "Unable to Login" y en el archivo log una serie de errores relacionados con los accesos a la base de datos.

Primero verifique mis bases de Datos con el comando:

sudo su postgres

psql -l


Veriamos algo similar a:

         Name            |   Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
----------------------------+-----------+----------+-------------+-------------+-----------------------
 Mi_Base_Odoo               | odoo      | LATIN1     | LATIN1 | LATIN1 | 
 postgres                   | postgres  | LATIN1     | LATIN1 | LATIN1 | 
 template0                  | postgres  | LATIN1     | LATIN1 | LATIN1 | =c/postgres          +
                            |           |          |             |             | postgres=CTc/postgres
 template1                  | postgres  | LATIN1     | LATIN1 | LATIN1 | =c/postgres          +


Este fue el problema principal por el que no podia acceder a mi Base de Datos, la solución fue cambiar la encodificación de la base principal de postgres y template1.

Ejecutaremos esta seria de comandos en la terminal de PostgreSQL, que bƔsicamente creara nuevamente la base principal de postgresq Template1:

sudo su postgres
psql
update pg_database set datistemplate=false where datname='template1';
drop database Template1;
create database template1 with owner=postgres encoding='UTF-8'
lc_collate='en_US.utf8' lc_ctype='en_US.utf8' template template0;
update pg_database set datistemplate=true where datname='template1';

Si nos muestra error en_US, instalamos:
locale-gen en_US.UTF-8 
Cambiamos el encoding de nuestra base postgres:

update pg_database set encoding=6 where datname='postgres';

Si necesitan conocer mas acerca de como asignar la codificación dejo esta imagen:



Ahora borramos y restauramos nuestra base de Datos y esta tendrÔ la codificación correcta.

En Ubuntu también debemos asignar Correctamente la codificación unicode.

1. Ejecutamos el comando que generara archivos locales con la codificación Unicode:

update pg_database set encoding=6 where datname='postgres';

2. Actualizamos el archivo /etc/default/locale con los valores correctos (o usamos update-locale LANG=xx LC_CTYPE=xx ...), si optamos por actualizar el archivo tendremos que poner estos cambios:

 $ sudo cat - > /etc/default/locale <<EOF
 LANG=en_US.UTF-8
 LANGUAGE=
 LC_CTYPE="en_US.UTF-8"
 LC_NUMERIC="en_US.UTF-8"
 LC_TIME="en_US.UTF-8"
 LC_COLLATE="en_US.UTF-8"
 LC_MONETARY="en_US.UTF-8"
 LC_MESSAGES="en_US.UTF-8"
 LC_PAPER="en_US.UTF-8"
 LC_NAME="en_US.UTF-8"
 LC_ADDRESS="en_US.UTF-8"
 LC_TELEPHONE="en_US.UTF-8"
 LC_MEASUREMENT="en_US.UTF-8"
 LC_IDENTIFICATION="en_US.UTF-8"
 LC_ALL=en_US.UTF-8
 EOF

Reiniciamos nuestro servidor Odoo y podemos trabajar de forma correcta.

miƩrcoles, 25 de mayo de 2016

Redireccionar Odoo a la Pagina Web Principal de una Base de Datos sin DB Filter

Redirección de una Pagina Web sin enviar a los Visitantes al Login o a la Selección de  la Base de Datos



    Un problema que Ćŗltimamente eh notado en Odoo, es al momento de activar los Portales Web y tener MĆŗltiples Bases de Datos, normalmente envĆ­a a los visitantes a la selección de la Base de Datos y cuando redireccionamos el trafico de un dominio a nuestro servidor Web, este siempre es enviado directamente al login y no a la pagina Web, bueno esto puede resolverse de muchas formas, utilizando subdominios, reverse proxy con nginx y muchas mas, a mi parecer todas eran un poco complejas y necesitaban muchos pasos, me di a la tarea de pensar un poco y modificar el mĆ©todo principal de re direccionamiento de odoo, el cual se encuentra en:

path_addons_odoo/web/controller/main.py

Podemos modificar este archivo con vim, vi, nano, gedit, sublime text, brackets o cualquier editor, simplemente debemos ir al metodo llamado def_login_redirect().

Debemos comentar el metodo quedando de la siguiente forma:


#def login_redirect():
#    url = '/web/login?'
#    # built the redirect url, keeping all the query parameters of the url
#    redirect_url = '%s?%s' % (request.httprequest.base_url, werkzeug.urls.url_encode(request.params))
#    return """<html><head><script>
#        window.location = '%sredirect=' + encodeURIComponent("%s" + location.hash);
#    </script></head></html>
#    """ % (url, redirect_url)

Modificamos el mƩtodo quedando de la siguiente manera:

def login_redirect():
    return """<html><head><script>
        window.location = '%sredirect=' + encodeURIComponent("%s" + location.hash);
    </script></head></html>
    """ % ('/?db=Mi_Base_de_Datos', '')

Notemos  que al final solo debemos enviar la Base a la que  se enviara a los visitantes, esta tambiĆ©n debera contener nuestra pagina Web.

Si vamos a redireccionar el trafico de un dominio externo hacia nuestro servidor Odoo, este debe ser redireccionado de la siguiente manera:

http://odoo.poncesoft.net:8069/?db=Mi_Base_de_Datos&web

El valor Mi_Base_de_Datos corresponde a la misma base a la que redireccionamos el mƩtodo login_redirect()


Nota: Cada uno de los valores para el redireccionamiento de nuestra aplicación, dependerÔ de la instalación de nuestro Servidor Odoo y si utilizamos un servidor Web como Nginx, Apache, etc. o la ejecución nativa de Odoo.

martes, 26 de abril de 2016

Eliminar Base de Datos desde Terminal PostgreSQL 9.X

Como eliminar Base de Datos con Sesiones Activas desde Terminal


Para eliminar una base de datos desde Terminal y esta tiene alguna conexión activa es imposible, lo podemos realizar desde la terminal de postgreSQL con el comando:

SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'Base_Borrar'
  AND pid <> pg_backend_pid();

lunes, 22 de febrero de 2016

Insertar Registros por Query SQL y retornar el ID (Odoo y OpenERP)

Insertar Registro Directamente en Base de Datos y Retornar el ID




     En ocasiones es necesario optimizar un poco nuestro código en base a Querys directos a base de datos, muchas veces insertamos registros, pero es difĆ­cil conocer el id que acabamos de insertar, un error muy comĆŗn con la programación es consultar el ultimo ID de la tabla, esto puede darnos la solución cuando solo trabajamos nosotros en la Base de Datos, pero en un entorno real, con concurrencia a la base de datos, el ultimó ID seria muy variable, para esto podemos apoyarnos de PostgreSQL y el comando RETURNING, este comando nos retorna cualquier valor, en este caso la columna serial ID, la estructura es muy simple:


self.env.cr.execute(""" INSERT INTO res_partner (name,customer) VALUES ('PonceSoft', True) RETURNING id; """)

my_id=self.env.cr.fetchall()[0][0]

La variable my_id es el ID que acabamos de insertar en la Base de Datos.



viernes, 22 de enero de 2016

Monitoreo de bloqueos

Monitoreo de bloqueos

Mirando el link pg_locks nos muestra que bloqueos han sido otorgados y que procesos estĆ”n esperando por estos. Una buena consulta para empezar a mirar los problemas inherentes a los bloqueos:
  SELECT relname,pg_locks.* 
      FROM pg_class,pg_locks 
      WHERE relfilenode=relation AND NOT GRANTED;
  • Revisando cuales son los procesos que estan manteniendo o esperando los bloqueos, es fĆ”cil si utiliza la referencia en pg_stat_activity

martes, 8 de septiembre de 2015

Ruta Fisica de Bases de Datos PostgreSQL

¿Donde se encuentran mis BD de Postgres?

Es muy comĆŗn tener la duda acerca de la ruta de instalacion de PostgreSQL y en donde estan almacenadas mis Bases de Datos, si utilizas Ubuntu la ruta es:
  •  /var/lib/postgresql/9.4/main/
Si estas usando Windows la ruta seria:
  • C:\Program Files\PostgreSQL\9.4\main
Si necesitas la carpeta en donde se encuentran tus bases, existe dentro de esa ruta la carpeta con el nombre base:
  • /var/lib/postgresql/9.4/main/base
Si escribimos ls observarĆ­amos solo seran carpetas del tipo:

Si queremos obtener una relación sobre carpeta y base de datos que le corresponde:

  1. Entramos como superusuario de Postgres: sudo su postgres
  2. Nos conectamos al Template 1: psql template1;
  3. Ejecutamos el siguiente Script:  select datname,oid from pg_database;
El resultado anterior nos mostrara el nombre de la carpeta y a que base corresponde.

miƩrcoles, 8 de enero de 2014

MƩtodos ORM BƔsicos para Programar Modulos en Odoo (OpenERP)

MƩtodos ORM bƔsicos (Crear, Buscar, Leer, Actualizar y Borrar)

MƩtodo create

Sintaxis

create (cr, uid, values, context=None)

Crea un nuevo registro con los valores especificados. ParƔmetros especƭficos:

•values: Diccionario con los valores de los campos para el nuevo registro.

Devuelve el id del registro creado. Puede generar los siguientes errores:

•AccessError: Si el usuario no tiene permisos de escritura en el objeto solicitado, o si el usuario intenta
ignorar las reglas de acceso para crear el objeto solicitado.

•ValidateError: Si el usuario intenta introducir un valor invĆ”lido para un campo que no estĆ” en la
selección.

•UserError: Si se crease un bucle en una estructura de objetos jerĆ”rquica como resultado de la operación (como establecer un objeto como su propio padre).

Por ejemplo para crear un producto tendriamos que generar el diccionario con los valores necesarios, principalmente los que son requeridos por el Modelo:

product_obj = self.pool.get('product.product')

product_vals = {
                         'name': 'Producto X',
                         'type': 'product' ,
                         'list_price': 45.00,
                         'procure_method': 'make_to_stock',
                         }

product_create_id = product_obj.create(cr, uid, product_vals, context=None)

lunes, 6 de enero de 2014

Restricciones en OpenERP mediante PostgreSQL

En OpenERP existen 2 Tipos de principales para validar la información que esta introduciendo el usuario contra la contenida en el sistema, ya sea contra la hora del sistema o algĆŗn formato necesario para la información, etc., estos tipos de validación serian:
 - Mediante funciones Python: Este tipo de restricción se realiza mediante funciones python.
 - Mediante restricciones de la Base de Datos(SQL Constraint): Este tipo de restricción se define en la clase a la cual se aplicara o la tabla a la cual se estarĆ” validando que los datos cumplan con los requisitos que definimos, por ejemplo si queremos que el campo nombre de un producto sea Ćŗnico tendrĆ­amos que tener esta restricción en mi clase.
Restricciones con Funciones Python