SQLAlchemy's DateTime
türü, nakil olmayan bir datetime nesnesini veritabanına kaydetmek ve bu şekilde döndürmek için timezone=True
bağımsız değişkenine izin verir. tzinfo
'un saat dilimini değiştirmek için SQLAlchemy'nin örneğin UTC gibi olabilmesi için herhangi bir yolu var mı? default=datetime.datetime.utcnow
'u kullanabileceğimin farkındayım; bununla birlikte, naif bir yerel zaman çizelgesine dayanan bir tarihte geçen birini mutlu bir şekilde kabul edebilecek bir naif bir zamandır, bununla birlikte timezone=True
kullansaydım bile, normal ya da UTC zamanını, normalize etmek için bir taban zaman dilimi kullanmadan naif yapar. Datetime nesnesini naif olmayan yapmak için (pytz kullanarak) denedim, ancak bunu DB'ye kaydettiğimde, naif olarak geri geliyor. datetime.datetime.utcnow çok iyi timezone=True
çalışmaz nasılSQLAlchemy DateTime zaman dilimi
Not:
import sqlalchemy as sa
from sqlalchemy.sql import select
import datetime
metadata = sa.MetaData('postgres://user:[email protected]/db')
data_table = sa.Table('data', metadata,
sa.Column('id', sa.types.Integer, primary_key=True),
sa.Column('date', sa.types.DateTime(timezone=True), default=datetime.datetime.utcnow)
)
metadata.create_all()
engine = metadata.bind
conn = engine.connect()
result = conn.execute(data_table.insert().values(id=1))
s = select([data_table])
result = conn.execute(s)
row = result.fetchone()
(1, datetime.datetime (2009, 1, 6, 0, 9, 36, 891.887)) benim localtime dengeleniyor
row[1].utcoffset()
datetime.timedelta (-1, 64800) # !!
datetime.datetime.now(tz=pytz.timezone("US/Central"))
datetime.timedelta (0) #UTCdatetime.timedelta (-1, 64800)
datetime.datetime.now(tz=pytz.timezone("UTC"))
bunu değiştirmek bile UTC'yi açıkça kullanmak için:
...
data_table = sa.Table('data', metadata, sa.Column('id', sa.types.Integer, primary_key=True), sa.Column('date', sa.types.DateTime(timezone=True), default=datetime.datetime.now(tz=pytz.timezone('UTC'))) ) row[1].utcoffset()
...
datetime.timedelta (-1, 64800) o zaman dilimini kullanmak vermedi # açıkça
Ya düşerse eklendi
timezone=True
:...
data_table = sa.Table('data', metadata, sa.Column('id', sa.types.Integer, primary_key=True), sa.Column('date', sa.types.DateTime(), default=datetime.datetime.now(tz=pytz.timezone('UTC'))) ) row[1].utcoffset() is None
...
Gerçek # bile db bir saat dilimi bu kez
"Zaman dilimi yapılandırma parametresi", depolanan veritabanındaki datetime_with_timzone'daki saat dilimi bilgisidir? –
@Ciastopiekarz Hayır. 'Timezone' yapılandırma parametresi bir istemci bağlantı parametresidir. Değeri UTC'de saklanan "saat dilimine sahip tarihsaat", bu "saat dilimi" parametresinde belirtilen görüntüyü size göstermeden veya döndürmeden önce dönüştürülür. Geçerli bağlantınız için hangi değerin olduğunu kontrol etmek için 'SHOW timezone'unu kullanın. Gerçekten neye ihtiyacınız olduğunu bir düşünün: Bir olayın meydana geldiği zamanı saklamak mı gerekiyor yoksa depolanmış veri uzunluğu değerinin gerçekte hangi saat diliminde kaynaklandığı da kaydedilmeli mi? İkincisi ise, bu bilgiyi ayrı ayrı saklamanız gerekir. – compostus
Sadece ne zaman gerçekleştiğini, ancak UTC'de, muhtemelen mevcut bağlantıyı bildiğim zaman, zaman dilimi bilgisi olmadan, kullanıcının tam olarak ne zaman doğru bir olay meydana geldiğini bilmeyeceğim. –