Muchas veces tenemos la necesidad de cargar datos a una tabla de nuestra base de datos en postrgesql desde un archivo ya sea de texto o un csv, para que esto no sea un dolor de cabeza y sea rapido ya que algunas herramientas lo logran pero tardan demasiado, podemos apoyarnos del comando Copy, que es un comando nativo de PostgreSql que podemos utilizar desde una terminal pgsql.
La sintaxis la podemos encontrar rapidamente con \h desde la terminal y su uso es muy sencillo, como todo comando basicamente es origen - destino veamos el patròn:
test=# copy (column1,column2,column3...) from '/ruta/nombre_archivo.csv' DELIMITERS ',' CSV;
Practicamente esto seria todo lo necesario para migrar los datos de una forma sencilla y rapida, expliquemos un poco de que se trata:
La primer parte es mi terminal psql: test=# (la cual accedo desde un shel con el comando psql -U usuario -d BaseDeDatos)
Posteriormente viene el comando copy: se compone de varias partes que en la ayuda del comando vienen ( \h copy desde la terminal psql) despues de la palabra copy colocamos las columnas de nuestra base de datos en donde caeran los datos del archivo el orden que useamos sera como se insertaran las columnas de nuestro archivo, mas adelante un ejemplo, podemos tambien omitir poner los nombres de las columnas esto indica que todo el archivo se cargara tal cual viene sobre las columnas que tengamos en la base de datos, osease ira cargando columna del archivo columna de la tabla y asi sucesivamente, despues viene la palabra from y posteriormente la ruta del archivo usamos la palabra Delimiters para indicar como esta delimitado nuestro archivo puede ser tabuladores ('\t'), comas, punto y coma o lo que sea que tengamos el archivo, indicamos el formato y listo esto hará magia en cargar miles o millones de datos en segundos o quiza minutos.
Ahora vemos un ejemplo funcional:
test=# copy pacientes (curp,paterno,materno,nombre,poliza,inicial,final,sexo,fec_nac) from '/tmp/archivo_de_pacientes.csv' DELIMITERS ',' CSV;
Y en segundos o minutos(depende el tamaño de tu archivo) tendremos los datos de nuestro archivo dentro de nuestra base de datos. Cabe mencionar que los datos que ingresemos de esta forma se colocan al final de la tabla es decir si tenemos registros previos en esta tabla, no son afectados y mas bien son anexados al final de la tabla.
Quitar Encabezados
Tambien es importante mencionar que algunos archivos tienen encabezados, por ejemplo no solo vienen los datos sino tambien los encabezados como name, surname, address etc... podemos usar la opcion header para que los ignore quedando de la siguiente manera:
test=# copy pacientes (curp,paterno,materno,nombre,poliza,inicial,final,sexo,fec_nac) from '/tmp/archivo_de_pacientes.csv' DELIMITERS ',' CSV header;
Con esto al hacer la migracion los encabezados de nuestro archivo seran ignorados.
Por último no olviden que los comandos como select, delete... etc.. incluso copy en psql finalizan con ";" a mi siempre se me olvida ponerlo.
jueves, 27 de enero de 2011
Remplazar un texto de un arhivo en linux con el comando sed
Cuando tenemos archivos de texto, csv y otros que son demasiado pesados, es un martirio intentar abrirlos con un editor, llamese excel, spreed sheet de open offices u otro similar ya que con los miles o millones de registros tardariamos mucho en solo abrirlos ahora ni imaginar en remplazar una palabra, para evitar todo esto buscando en internet y con ayuda de "Beto" me tope con el comando "sed" que es una maravilla.
Vamos al grano:
Para evitar abrir el archivo y tener que editar a mano, desde consola podemos utilizar el comando de la siguiente forma:
alex@alex-dev:/tmp$ sed -e 's/palabra_a_buscar/palabra_remplazo/g' archivo_origen.csv > archivo_final.csv
DE esta forma vemos un ejemplo concreto en el cual cambiaremos la palabra NULL por TEST, cabe señalar que: "alex@alex-dev:/tmp$" es mi terminal NO ES PARTE DEL COMANDO!!!
ahora si veamos el ejemplo:
alex@alex-dev:/tmp$ sed -e 's/NULL/TEST/g' archivo_origen.csv > archivo_final.csv
y de esta forma abremos remplazado todas esas plabras de ese pesado archivo, para concer mas acerca de la sintaxys hay que ver el man del comando y leer un poco acerca de expresiones regulares.
Vamos al grano:
Para evitar abrir el archivo y tener que editar a mano, desde consola podemos utilizar el comando de la siguiente forma:
alex@alex-dev:/tmp$ sed -e 's/palabra_a_buscar/palabra_remplazo/g' archivo_origen.csv > archivo_final.csv
DE esta forma vemos un ejemplo concreto en el cual cambiaremos la palabra NULL por TEST, cabe señalar que: "alex@alex-dev:/tmp$" es mi terminal NO ES PARTE DEL COMANDO!!!
ahora si veamos el ejemplo:
alex@alex-dev:/tmp$ sed -e 's/NULL/TEST/g' archivo_origen.csv > archivo_final.csv
y de esta forma abremos remplazado todas esas plabras de ese pesado archivo, para concer mas acerca de la sintaxys hay que ver el man del comando y leer un poco acerca de expresiones regulares.
lunes, 6 de septiembre de 2010
Cargar datos desde fixtures con rails.
Para cargar datos que se encuentran en la carpeta, /test/fixtures de nuestros proyecto rails, podemos usar el comando rake que nos permite el manejo de esta tarea.
la sintaxis es la siguiente.
Para cargar todos los fixtures usamos el siguiente comando desde la raiz del proyecto:
Si solo queremos cargar algun fixture en particular usamos el siguiente comando:
Los fixtures pueden estar en formato yml (yaml) o en formato CSV(separado por comas).
la sintaxis es la siguiente.
Para cargar todos los fixtures usamos el siguiente comando desde la raiz del proyecto:
rake db:fixtures:load
Si solo queremos cargar algun fixture en particular usamos el siguiente comando:
rake db:fixtures:load FIXTURES=users,storesLos fixtures pueden estar en formato yml (yaml) o en formato CSV(separado por comas).
Export CSV from psql
Si alguna vez necesitamos obtener el resultado de una consulta SQL usando la terminal psql de postgres, en un formato csv, podemos realizar lo siguiente.
Una vez en la terminal tecleamos \o ruta, ejemplo
psql=# \o /tmp/archivo.csv
Lo anterior indica que el resultado lo hara por medio de un output (\o) y lo colocara en el archivo indicado ( /tmp/archivo.csv).
De esta froma tenemos un archivo csv que podremos editar con cualquier software de hoja de calculo.
Al abrirlo es importante indicarle que el separador no será la coma sino el signo pipe "|", para que respete la separacion de los registros y podamos manejarlo mas facilmente.
Una vez en la terminal tecleamos \o ruta, ejemplo
psql=# \o /tmp/archivo.csv
Lo anterior indica que el resultado lo hara por medio de un output (\o) y lo colocara en el archivo indicado ( /tmp/archivo.csv).
De esta froma tenemos un archivo csv que podremos editar con cualquier software de hoja de calculo.
Al abrirlo es importante indicarle que el separador no será la coma sino el signo pipe "|", para que respete la separacion de los registros y podamos manejarlo mas facilmente.
viernes, 6 de marzo de 2009
Internacionalizacion I18n en Ruby on Rails
I18n antes que nada significa Internacionalizacion, es por eso que inicia con la letra I despues el numero 18 que indica el numero de caracteres y al final la n que es el último caracter de la palabra "Internationalization".
Ruby on Rails originalmente trae soporte para fechas y palabras en ingles.
En un proyecto que estube realizando (un sistema de asistencias), que teniamos que asignar hora de entrada, salida etc... tenia que utilizar oviamente fechas y horas, el problema surgia que en el mostrar (show o index), las fechas siempre me aparecian en formato de E.U.A, es decir Año Mes y Dia, y peor aun, si queria la hora en formato largo me ponia: "February 17, 2009".
La solucion consistio en leer un poco acerca de I18n y aqui la solucion.
1. Lo primero que tuve que hacer fue descargar el archivo de internacionalizacion que necesitaba, en este caso el de español, de la siguiente direccion: "http://github.com/svenfuchs/rails-i18n/tree/e5878d3c661e0b9ad364951c96f1f4f39960a2f1/rails/locale"
2. Despues de descargarlo hay que ubicarlo en la carpeta locales del Framework que se localiza en config/locales/ dentro de esta carpeta seguramente estara el archivo en.yml que es el que trae por default, no importa si tienes ambos, puedes bajar el del pais que requieras.
3. Ahora bien tenemos que hacer que incluya rails este archivo en nuestro proyecto, esto lo hacemos en el archivo environment.rb que se encuentra en: config/environment.rb en este archivo tenemos que poner lo siguiente:
config.i18n.default_locale = :es
Es asi como indicamos que tome los formatos y traducciones que vienen en ese archivo, trata de ponerlo cerca de donde esta una linea similar pero comentada, solo por órden.
4. Ahora tenemos todo listo, en nuestra vista o donde vamos a mostrar el campo tipo fecha tenemos que hacerlo de la siguiente manera:
<%=l @assistance.date %>
Notese que inicia con una l que es la que le indica que "localize" ese atributo, puede incluir tambien el tradicional h que es para que escape automáticamente caracteres raros, sería de la siguiente manera:
<%=h l @assistance.date %>
Ambos mostrarian algo asi:
2009-02-09
Esta fecha parece no ser la correcta, o mas bien no como queremos que la muestre, pues nos gustaría mas que fuera como comunmente la usamos día, mes y año, para eso solo hay que introducirse un poco en el archivo es.yml que agregamos en la carpeta config/localize/es.yml y dentro encontraremos toda la estructura del formateo de fechas y algunas traducciones, para este caso en particular, vayamos a la parte donde dice :date y vamos a ver algo similar a:
date:
formats:
# Use the strftime parameters for formats.
# When no format has been given, it uses default.
# You can provide other formats here if you like!
default: "%Y-%m-%d"
short: "%d de %b"
long: "%d de %B de %Y"
pues bien com ahi dice esta parte podemos agragar nuevos formatos de fechas, como vemos toma el default cuando no le indicamos cual queremos que tome, mas adelante veremo como hacer eso, por ahora cambiaremos el que toma por default, como nos dice tambien utiliza el formateo de fechas de Ruby (strftime), entonces tendremos que seguir esa sintaxis para agregar o midificar los formatos (si quieres saber mas a cerca de este formateo puedes ir a la documentacion de Ruby).
Bien, sigamos, cambiaremos la siguiente linea de este archivo:
default: "%Y-%m-%d"
Que es el que toma por default, como vemos priemro colocara el año %Y
posteriormente un guion -
despues el mes %m
seguido otro guion -
por ultimo el dia %d
todo entre comillas.
Es por esto que la fecha que nos muestra es del tipo 2009-02-09, cambiando el default de la siguiente forma:
default: "%d-%m-%Y"
al cambiar el orden ahora nuestras fechas seran 09-02-2009 :D :D :D
Siguiendo con esto, nos peguntaremos, no ps esta chido pero si quiero un formato personal o un formato del tipo: 17 de Febrero de 2009
bien para esto tendremos que acceder a los formatos que se encuentran debajo, en esta seccion
date:
formats:
# Use the strftime parameters for formats.
# When no format has been given, it uses default.
# You can provide other formats here if you like!
default: "%d-%m-%Y"
short: "%d de %b"
long: "%d de %B de %Y"
como vemos tenemos el formato long y short pero, ¿como acceder a este u otro que formemos?, es sencillo, en nuestra vista como habiamos visto toma el que es por default, pero si le colocamos :format => :long ó :format => :short
de la siguiente forma:
<%=l @assistance.date, :format => :long %>
Nos mostraria una fecha de este tipo: 17 de Febrero de 2009
Si queremos agregar un formato nuevo podemos agregarlo en el mismo archivo de la siguiente forma:
date:
formats:
# Use the strftime parameters for formats.
# When no format has been given, it uses default.
# You can provide other formats here if you like!
default: "%d-%m-%Y"
short: "%d de %b"
long: "%d de %B de %Y"
mi_fecha: "México DF a %d de %B de %Y"
ahora de esta forma podemos llamarlo en nuestra vista de la siguiente manera:
<%=l @assistance.date, :format => :mi_fecha %>
Y esto nos mostraria algo asi:
México DF a 17 de Febrero de 2009
Pues bien asi es como Rails nos facilita la vida para el formateo de fechas por medio de internationalization.
Ruby on Rails originalmente trae soporte para fechas y palabras en ingles.
En un proyecto que estube realizando (un sistema de asistencias), que teniamos que asignar hora de entrada, salida etc... tenia que utilizar oviamente fechas y horas, el problema surgia que en el mostrar (show o index), las fechas siempre me aparecian en formato de E.U.A, es decir Año Mes y Dia, y peor aun, si queria la hora en formato largo me ponia: "February 17, 2009".
La solucion consistio en leer un poco acerca de I18n y aqui la solucion.
1. Lo primero que tuve que hacer fue descargar el archivo de internacionalizacion que necesitaba, en este caso el de español, de la siguiente direccion: "http://github.com/svenfuchs/rails-i18n/tree/e5878d3c661e0b9ad364951c96f1f4f39960a2f1/rails/locale"
2. Despues de descargarlo hay que ubicarlo en la carpeta locales del Framework que se localiza en config/locales/ dentro de esta carpeta seguramente estara el archivo en.yml que es el que trae por default, no importa si tienes ambos, puedes bajar el del pais que requieras.
3. Ahora bien tenemos que hacer que incluya rails este archivo en nuestro proyecto, esto lo hacemos en el archivo environment.rb que se encuentra en: config/environment.rb en este archivo tenemos que poner lo siguiente:
config.i18n.default_locale = :es
Es asi como indicamos que tome los formatos y traducciones que vienen en ese archivo, trata de ponerlo cerca de donde esta una linea similar pero comentada, solo por órden.
4. Ahora tenemos todo listo, en nuestra vista o donde vamos a mostrar el campo tipo fecha tenemos que hacerlo de la siguiente manera:
<%=l @assistance.date %>
Notese que inicia con una l que es la que le indica que "localize" ese atributo, puede incluir tambien el tradicional h que es para que escape automáticamente caracteres raros, sería de la siguiente manera:
<%=h l @assistance.date %>
Ambos mostrarian algo asi:
2009-02-09
Esta fecha parece no ser la correcta, o mas bien no como queremos que la muestre, pues nos gustaría mas que fuera como comunmente la usamos día, mes y año, para eso solo hay que introducirse un poco en el archivo es.yml que agregamos en la carpeta config/localize/es.yml y dentro encontraremos toda la estructura del formateo de fechas y algunas traducciones, para este caso en particular, vayamos a la parte donde dice :date y vamos a ver algo similar a:
date:
formats:
# Use the strftime parameters for formats.
# When no format has been given, it uses default.
# You can provide other formats here if you like!
default: "%Y-%m-%d"
short: "%d de %b"
long: "%d de %B de %Y"
pues bien com ahi dice esta parte podemos agragar nuevos formatos de fechas, como vemos toma el default cuando no le indicamos cual queremos que tome, mas adelante veremo como hacer eso, por ahora cambiaremos el que toma por default, como nos dice tambien utiliza el formateo de fechas de Ruby (strftime), entonces tendremos que seguir esa sintaxis para agregar o midificar los formatos (si quieres saber mas a cerca de este formateo puedes ir a la documentacion de Ruby).
Bien, sigamos, cambiaremos la siguiente linea de este archivo:
default: "%Y-%m-%d"
Que es el que toma por default, como vemos priemro colocara el año %Y
posteriormente un guion -
despues el mes %m
seguido otro guion -
por ultimo el dia %d
todo entre comillas.
Es por esto que la fecha que nos muestra es del tipo 2009-02-09, cambiando el default de la siguiente forma:
default: "%d-%m-%Y"
al cambiar el orden ahora nuestras fechas seran 09-02-2009 :D :D :D
Siguiendo con esto, nos peguntaremos, no ps esta chido pero si quiero un formato personal o un formato del tipo: 17 de Febrero de 2009
bien para esto tendremos que acceder a los formatos que se encuentran debajo, en esta seccion
date:
formats:
# Use the strftime parameters for formats.
# When no format has been given, it uses default.
# You can provide other formats here if you like!
default: "%d-%m-%Y"
short: "%d de %b"
long: "%d de %B de %Y"
como vemos tenemos el formato long y short pero, ¿como acceder a este u otro que formemos?, es sencillo, en nuestra vista como habiamos visto toma el que es por default, pero si le colocamos :format => :long ó :format => :short
de la siguiente forma:
<%=l @assistance.date, :format => :long %>
Nos mostraria una fecha de este tipo: 17 de Febrero de 2009
Si queremos agregar un formato nuevo podemos agregarlo en el mismo archivo de la siguiente forma:
date:
formats:
# Use the strftime parameters for formats.
# When no format has been given, it uses default.
# You can provide other formats here if you like!
default: "%d-%m-%Y"
short: "%d de %b"
long: "%d de %B de %Y"
mi_fecha: "México DF a %d de %B de %Y"
ahora de esta forma podemos llamarlo en nuestra vista de la siguiente manera:
<%=l @assistance.date, :format => :mi_fecha %>
Y esto nos mostraria algo asi:
México DF a 17 de Febrero de 2009
Pues bien asi es como Rails nos facilita la vida para el formateo de fechas por medio de internationalization.
Saludos.
:D :D :D
martes, 29 de abril de 2008
En las relaciones uno a muchos, se pasa la PK del lado de uno al de muchos.
Por ejemplo supongamos tenemos las tablas:
Premio
TipoPremio
con los siguientes atributos
Premio
*id
*name
*fecha
TipoPremio
*id
*name
Ahora la lógica es la siguiente, un premio tiene unicamente un tipo de de premio, pero un tipo de premio puede ser usado para varios premios en particular, es decir un premio especifico es de un tipo, otro de otro tipo o del mismo y asi, quedando la relacion de uno a mucho de la forma un Tipo Premio puedes ser para muchos Premios y un Premio solo tiene un tipo de premio, es decir uno a muchos de TipoPremio a Premio.
Las tablas quedarian de la siguiente forma:Premio
*id
*name
*fecha
*TipoPremio_id
TipoPremio
*id
*name
Por ejemplo supongamos tenemos las tablas:
Premio
TipoPremio
con los siguientes atributos
Premio
*id
*name
*fecha
TipoPremio
*id
*name
Ahora la lógica es la siguiente, un premio tiene unicamente un tipo de de premio, pero un tipo de premio puede ser usado para varios premios en particular, es decir un premio especifico es de un tipo, otro de otro tipo o del mismo y asi, quedando la relacion de uno a mucho de la forma un Tipo Premio puedes ser para muchos Premios y un Premio solo tiene un tipo de premio, es decir uno a muchos de TipoPremio a Premio.
Las tablas quedarian de la siguiente forma:Premio
*id
*name
*fecha
*TipoPremio_id
TipoPremio
*id
*name
martes, 15 de enero de 2008
Permitir conexiones remotas en PostgreSql 8.2
Por motivos de seguridad, la configuración por defecto no admite conexiones externas. Para habilitarlas tenemos que editar el fichero /etc/postgresql/8.2/main/postgresql.conf.
$ sudo gedit /etc/postgresql/8.2/main/postgresql.conf
Ahora buscamos las siguientes líneas que se encuentran comentadas:
#listen_addresses = 'localhost'
Y la substituimos por la siguiente línea:
listen_addresses = '*'
Posteriormente buscamos la siguiente línea y le quitamos la marca de comentario:
#password_encryption = on
Y nos debe quedar lo siguiente:
password_encryption = on
Guardamos los cambios y reiniciamos el demonio para que los cambios surjan efecto:
$ sudo /etc/init.d/postgresql-8.2 restart
fuente: http://pintucoperu.wordpress.com/category/linux-ubuntu-administracion/page/3/
$ sudo gedit /etc/postgresql/8.2/main/postgresql.conf
Ahora buscamos las siguientes líneas que se encuentran comentadas:
#listen_addresses = 'localhost'
Y la substituimos por la siguiente línea:
listen_addresses = '*'
Posteriormente buscamos la siguiente línea y le quitamos la marca de comentario:
#password_encryption = on
Y nos debe quedar lo siguiente:
password_encryption = on
Guardamos los cambios y reiniciamos el demonio para que los cambios surjan efecto:
$ sudo /etc/init.d/postgresql-8.2 restart
fuente: http://pintucoperu.wordpress.com/category/linux-ubuntu-administracion/page/3/
Suscribirse a:
Entradas (Atom)