2014-09-29 19 views
7

Aşağıdaki durum var: -: 2014-09-29 datetime değeri kaydedilirken, bu gibi görünüyor önce bir tarladasqlalchemy

timestamp without time zone 
  • Sağ ile Postgres arka uç 06: 00: 00 + 00: 00
  • sonra db aynı satır yüklemek ve değerdir: 2014-09-29 09:00:00

Yani veritabanında saklanan tarihtir artık 6:00 değil ama 9 am - yerel saat dilimimde dönüştürüldü.

Neler olduğunu anlamıyorum. Kaydedilen tarih neden yerel olarak dönüştürülür?

Teşekkürler.

Düzenleme @ univerio cevabı şey denedim Yani sonra

: Ben

.replace(tzinfo = None) 

yaparak tarih zaman tzinfo kaldırıldı Ve şimdi tarihinin doğru kaydedilir - bu ayarlanmaz yerel zamana. Niçin anlamıyorum, bu yüzden birisinin bir açıklaması olması durumunda soruyu şimdilik açık bırakacağım.

Teşekkürler.

+2

ayarlayabilirsiniz timezone istemci ayarı hakkında PostgreSQL istemci belgeleri: o saat dilimi bilgileri içeren bir zaman damgası ile dönüştürülmüş alacak görünür PostgreSQL tarafından zaman dilimi olmadan zaman damgası olarak saklandığında bağlantının saat dilimi. 'Datetime'nizi naif yaparak, PostgreSQL'in zaman damgasını olduğu gibi sakladığını söylüyorsunuz. Bu naip 'datetime's ile iyiyse, bu iyi bir çözümdür. Şahsen, bence her zaman farkında olan 'datetime's/'timestamp's ile çalışarak ve her zaman UTC kullanarak bu çarklardan kaçınmak daha doğru olur. – univerio

cevap

17

Neler olduğunu bildiğim, doğru datetime s değerini depoladığınız, ancak sütun WITHOUT TIME ZONE olduğu için bir saat dilimi ile geri okumadığınızdır. Her PostgreSQL bağlantısında, sistemin saat dilimine göre varsayılan bir saat dilimi vardır, bu nedenle belirli bir TIMESTAMP aldığınızda, sistem saat diliminde naif datetime olarak döndürülür. Bu nedenle, her zaman TIMESTAMP WITH TIME ZONE'u saklamayı öneriyorum. Eğer motoru oluşturmak zaman UTC için sqlalchemy içinde bağlantının saat dilimini değiştirmek için aşağıdakileri yapın isterseniz

:

engine = create_engine("...", connect_args={"options": "-c timezone=utc"}) 

Bu UTC bir naif datetime olarak geri değerini okumak yapmalıdır .

DÜZENLEME: @Peter Bu belge, bunun nasıl yapılacağını açıkça ortaya koymaz; Ben birkaç farklı dokümanlar okumak ve noktaları birleştirmek zorunda:

  1. Eğer dbapi connect()
  2. ekstra parametreleri hakkında size söyler connect üzerine psycopg2 belgeleri, doğrudan argümanlar geçmesine izin verir SQLAlchemy belgeleri yaklaşık connect_args Eğer -c command hakkında libpq
  3. PostgreSQL belgelerine ile bağlanırken komut satırı seçenekleri geçmesine izin verir options parametre üzerinde
  4. libpq belgelerine libpq için geçebilir Eğer
  5. nihayet yapılandırma ayarlarını değiştirmenize olanak tanır hat anahtarı, sen Düzenlemenizle Re
+0

UTC'yi varsayılan olarak bağlanmak için bir yol ararken birkaç saat sonra çözümünüzü buldum. Teşekkür ederim! Çok kullanışlı. Bunu nereden öğrendin? SQLAlchemy belgelerinde bulamadım. – Peter

+0

@Peter Yanıtım yorum yazmak için çok uzun; cevabımdaki cevaba bakın. – univerio

+0

Bu, aradığım şey gibi görünüyor. Ancak benim projemde motor oluşturmak için engine_from_config yöntemini kullanıyoruz. Engine_from_config işlevine de connect_args argümanını ekleyebilir miyim emin değilim? Bu direkt olarak dokümantasyonda açıklanmamaktadır. –