Update campo DateTime com o horário do database

1,455 views
Skip to first unread message

Gileno Alves

unread,
Apr 23, 2013, 7:04:27 PM4/23/13
to django...@googlegroups.com
Opa pessoal, normalmente quando se deseja um campo DateTimeField com o horário atual na hora do cadastro se coloca a opção auto_now_add=True só que o horário que este campo pega é o horário do servidor da aplicação, alguém já fez algo com o horário do servidor do banco de dados?

seria o equivalente (em postgresql):

update table minha_tabela set meu_campo=NOW() ....

Eu estava fazendo um Field personalizado que herda do DateTimeField e faz uma consulta no banco (um select mesmo) mas eu estou tentando evitar este select já que posso setar a hora no instante do insert ou update.

alguém sabe o método da class Field que é chamado para formar a consulta? Estou tentando usar o "pre_save" e o "get_db_prep_value" no "pre_save"

Aqui é o local onde tem o comportamento padrão dessa classe:

Alguém dá uma luz ai?

--
Gileno Filho, Web Developer

Douglas Miranda

unread,
Apr 23, 2013, 7:53:03 PM4/23/13
to django...@googlegroups.com
Não testei ( http://stackoverflow.com/a/10219860/1808134 ), mas acho que vai ter de ser algo como passar o NOW() ou current_timestamp como valor do campo datetimefield, alterando a sql final de inserção/atualização.



--
Você está recebendo esta mensagem porque se inscreveu no grupo "Django Brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para django-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 



--
 
Atenciosamente
Douglas Miranda

Manuel Gonçalves da Silva Neto

unread,
Apr 23, 2013, 8:14:39 PM4/23/13
to django-brasil
Não seria mais simples levantar um serviço de servidor de time e sincronizar o horario dos dois  servers ?



From: douglasmi...@gmail.com
Date: Tue, 23 Apr 2013 19:53:03 -0400
Subject: Re: Update campo DateTime com o horário do database
To: django...@googlegroups.com

Gileno Alves

unread,
Apr 23, 2013, 8:47:52 PM4/23/13
to django...@googlegroups.com
Douglas, obrigado pela sugestão eu estive procurando muita coisa, encontrei até uma forma de usar TIMESTAMP no mysql ao invés do DATETIME, alguns tópicos no stackoverflow mas o problema era que a maioria era falando para colocar o auto_now_add. Vou testar essa opção e dou um feedback aqui, na forma que eu estava tentando não ia dar certo, pois mexer no Field não tem como (pelo menos pelo que entendi) afetar o sql diretamente, a ideia é manter o sql no backend mesmo ai isso pode resolver.

Manuel, obrigado pela sugestão, mas acho que seria mais complexo, um simples NOW() - postgresql - na hora do update ou do insert já resolveria então para mim forçar sincronização dos servidores daria mais trabalho pelo fato de inserir um 3 cara na jogada que seria o serviço de time e como a aplicação terá vários bancos e servidores para fins diferentes eu não sei se isso vai ser possível a nível de regra de negócio.


2013/4/23 Manuel Gonçalves da Silva Neto <manu...@hotmail.com>

Gileno Alves

unread,
Apr 23, 2013, 8:48:50 PM4/23/13
to django...@googlegroups.com
De toda forma vou comentar essa possibilidade Manuel caso o link enviado por Douglas não funcione.


2013/4/23 Gileno Alves <gasc...@gmail.com>

Manuel Gonçalves da Silva Neto

unread,
Apr 23, 2013, 9:04:59 PM4/23/13
to django-brasil
Na verdade não tem um 3 elemento , você pode  instalar o serviço de tempo em um dos servers  , bota el pra sincronizar com os servidores globais e  faz a sua rede usar ele como master, assim todos os seus  servers  vão ter o mesmo horario , tem varios serviços que são criticos de  data/hora e se não fez isto até agora, um dia irá fazer. Se precisar de ajuda eu lhe passo um QuickStart com os comandos e  passos basicos em um servidor linux.



From: gasc...@gmail.com
Date: Tue, 23 Apr 2013 21:48:50 -0300

Gileno Alves

unread,
Apr 23, 2013, 9:14:03 PM4/23/13
to django...@googlegroups.com
Na verdade este serviço é crítico na questão da data/hora (por isso eu levantei a dúvida), só que o cliente quer centralizar no banco e quaisquer operações com tempo tem que vim do banco. Vou ver se consigo impor essa solução de sincronização.

Fabio C. Barrionuevo da Luz

unread,
Apr 24, 2013, 12:32:13 AM4/24/13
to django...@googlegroups.com

Marcos Thomaz

unread,
Apr 24, 2013, 2:08:06 AM4/24/13
to django...@googlegroups.com

Gileno, já testou algo do tipo:


seuFieldData = models.DateTimeField('Sua Data',default='current_timestamp', editable=False) 


ou 


seuFieldData = models.DateTimeField('Sua Data',default='now', editable=False) 

Gileno Alves

unread,
Apr 24, 2013, 7:41:10 AM4/24/13
to django...@googlegroups.com
Sim Fábio, um trigger funcionaria sim até existem alguns no banco mas eu queria evitar isso, porque para cada model que vá precisar disso (e são muitos) vou ter que implementar o trigger.

Opa Marcos, testei isso sim e não funcionou.

Vou me reunir hoje e discutir essas opções e posto aqui o que melhor atendeu, valeu pessoal.


2013/4/24 Fabio C. Barrionuevo da Luz <bna...@gmail.com>

Marcos Thomaz

unread,
Apr 24, 2013, 8:48:29 AM4/24/13
to django...@googlegroups.com

Beleza então,

Gileno, com um pre_save dá pra pegar a data do banco e setar para o field....  tipo:


from django.db import connection

def dateTimeFromPostgreSQL():

    cursor = connection.cursor()

    cursor.execute("SELECT CURRENT_TIMESTAMP")

    row = cursor.fetchone()

    return row[0]

 
e no pre_save atribua o retorno dessa função ao field. 

[]'s

Marcos Thomaz



Em terça-feira, 23 de abril de 2013 20h04min27s UTC-3, Gileno Alves escreveu:

Fabio C. Barrionuevo da Luz

unread,
Apr 24, 2013, 9:28:41 AM4/24/13
to django...@googlegroups.com
Gileno, quando achar a solução, compartilhe conosco.



--
Você está recebendo esta mensagem porque se inscreveu no grupo "Django Brasil" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para django-brasi...@googlegroups.com.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 

Gileno Alves

unread,
Apr 25, 2013, 6:28:22 PM4/25/13
to django...@googlegroups.com
Só adiantando, a solução que estava no stackoverflow funcionou depois de um import (o django_conversions) mas só funcionou para o mysql e ficou muito estranho tive que fazer o seguinte import:

from django.db.backends.mysql.base import django_convertions

Olhando o código fonte[1] dá para entender melhor mas ainda sim, não é uma solução legal, pelo menos o código não está, vou tentar melhorar e colocar para funcionar no postgresql

2013/4/24 Fabio C. Barrionuevo da Luz <bna...@gmail.com>
Gileno, quando achar a solução, compartilhe conosco.

Reply all
Reply to author
Forward
0 new messages