Estoy trabajando con SQLAlchemy, y aún no estoy seguro de qué base de datos usaré debajo de él, por lo que quiero permanecer como DB-agnóstico como sea posible. ¿Cómo puedo almacenar un objeto datetime que tenga en cuenta la zona horaria en el DB sin vincularme a una base de datos específica? En este momento, me estoy asegurando de que las horas sean UTC antes de almacenarlas en la base de datos y convertirlas a localizadas en el momento de la visualización, pero eso se siente poco elegante y frágil. ¿Existe una forma DB-agnóstica de obtener un datetime con reconocimiento de zona horaria de SQLAlchemy en lugar de obtener objetos ingeniosos de datatime de la base de datos?¿Puede SQLAlchemy DateTime Objects Only Be Naive?
22
A
Respuesta
40
Hay un parámetro timezone
en DateTime
tiempo de columna, por lo que no hay ningún problema con el almacenamiento de objetos de timezone-aware datetime
. Sin embargo, encontramos conveniente convertir almacenado datetime
a UTC automáticamente con un simple decorador Tipo:
from sqlalchemy import types
from dateutil.tz import tzutc
from datetime import datetime
class UTCDateTime(types.TypeDecorator):
impl = types.DateTime
def process_bind_param(self, value, engine):
if value is not None:
return value.astimezone(tzutc())
def process_result_value(self, value, engine):
if value is not None:
return datetime(value.year, value.month, value.day,
value.hour, value.minute, value.second,
value.microsecond, tzinfo=tzutc())
Nota, es decir se comporta muy bien cuando se utiliza ingenua datetime
por accidente (lo que significa que va a levantar una ValueError).
Cuestiones relacionadas
- 1. Rounding DateTime objects
- 2. datetime objects format
- 3. css name should be be?
- 4. Python SqlAlchemy order_by DateTime?
- 5. SQLAlchemy DateTime timezone
- 6. SQL Server 2005 DateTime (return only hh: mm)
- 7. Naive Bayes fila clasificación
- 8. Implementar Naive Bayes gaussiano
- 9. Chrome: JavaScript window.open to be Save-able
- 10. SqlAlchemy no aceptará el valor datetime.datetime.now en una columna DateTime
- 11. interpretando los resultados Naive Bayes
- 12. ¿Puede un DateTime ser nulo?
- 13. Diseño de Game Objects
- 14. SQLAlchemy ForeignKey no puede encontrar la tabla
- 15. DataGridView Columna de clasificación con Business Objects
- 16. numpy array of objects
- 17. WPF Toolkit DatePicker Month/Year Only
- 18. Training Naive Clasificador Bayes en los ngulos
- 19. Naive Bayesian y problema de cero frecuencia
- 20. AJAX only access
- 21. grep --ignore-case --only
- 22. mysql dump tables only
- 23. jquery validation only digits
- 24. Python simple naked objects
- 25. Javascript Global Objects
- 26. Array of PHP Objects
- 27. struct objects en python
- 28. Doctrine 2 Value Objects
- 29. Javascript expando objects
- 30. ¿Por qué datetime no se puede comparar?
Esto no funciona como está escrito, necesita un pequeño ajuste en 'process_bind_param':' def process_bind_param (self, value, engine): \ n si el valor no es None: \ n si value.tzinfo es None: \ n return value.replace (tzinfo = tzutc()) \ n else: \ n return value.astimezone (tzutc()) ' –
@Jesse Dhillon: es intencional evitar el almacenamiento accidental de objetos navideños datetime, mientras que su receta interpreta incorrectamente cualquier fecha y hora con cualquier zona horaria como UTC. –
@Dennis, entonces, si usa su tipo, se espera que cree y almacene solo objetos 'datetime' con timezone-aware? Ahora que lo entiendo, me gusta más su solución porque requiere que el usuario sea explícito sobre lo que están guardando. –