programing

SQL Chemy 기본 Date Time

goodsources 2022. 9. 5. 23:21
반응형

SQL Chemy 기본 Date Time

선언 모델은 다음과 같습니다.

import datetime
from sqlalchemy import Column, Integer, DateTime
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Test(Base):
    __tablename__ = 'test'

    id = Column(Integer, primary_key=True)
    created_date = DateTime(default=datetime.datetime.utcnow)

단, 이 모듈을 Import하려고 하면 다음 오류가 나타납니다.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "orm/models2.py", line 37, in <module>
    class Test(Base):
  File "orm/models2.py", line 41, in Test
    created_date = sqlalchemy.DateTime(default=datetime.datetime.utcnow)
TypeError: __init__() got an unexpected keyword argument 'default'

Integer 유형을 사용하면 기본값을 설정할 수 있습니다.무슨 일이야?

클라이언트가 아닌 DB 내에서 타임스탬프 계산

제정신을 차리기 위해, 아마도 당신은 모든 것을 가지고 싶어할 것이다.datetimes응용 프로그램 서버가 아닌 DB 서버에 의해 계산됩니다.애플리케이션의 타임스탬프를 계산하면 문제가 발생할 수 있습니다.이는 네트워크 지연 시간이 가변적이고 클라이언트의 클럭 드리프트가 약간 다르며 프로그래밍 언어에 따라 시간을 약간 다르게 계산할 수 있기 때문입니다.

SQLLechemy를 사용하면 타임스탬프 자체를 계산하도록 DB에 지시하는 또는 (서로 에일리어스)를 전달하여 이 작업을 수행할 수 있습니다.

SQL Alchemy 사용server_default

또한 이미 DB에 값을 계산하도록 지시하고 있는 기본값의 경우 일반적으로 다음과 같이 사용하는 것이 좋습니다.default그러면 SQL Chemy가 디폴트값을 전달하도록 지시합니다.CREATE TABLE진술.

예를 들어 이 테이블에 대해 애드혹스크립트를 작성하는 경우server_default스크립트에 타임스탬프 콜을 수동으로 추가할 필요가 없습니다.데이터베이스가 자동적으로 설정됩니다.

SQL Chemy의 개요onupdate/server_onupdate

SQL Chemy는 또한onupdate따라서 행이 갱신될 때마다 새로운 타임스탬프가 삽입됩니다.타임스탬프 자체를 계산하도록 DB에 지시하는 것이 가장 좋습니다.

from sqlalchemy.sql import func

time_created = Column(DateTime(timezone=True), server_default=func.now())
time_updated = Column(DateTime(timezone=True), onupdate=func.now())

파라미터가 있지만server_default서버 측에는 아무것도 설정되어 있지 않습니다.SQLalchemy에서는 갱신 시(아마도 컬럼에 트리거를 작성했을 수 있음) 데이터베이스가 컬럼을 변경한다고만 알립니다.따라서 SQLalchemy는 대응하는 오브젝트를 갱신할 수 있도록 반환값을 요구합니다.

또 다른 잠재력:

단일 트랜잭션 내에서 많은 변경을 가하면 모든 변경에 동일한 타임스탬프가 있다는 사실을 알게 되면 놀랄 수 있습니다.이는 SQL 표준이 다음과 같이 규정하고 있기 때문입니다.CURRENT_TIMESTAMP트랜잭션 시작에 따라 값을 반환합니다.

PostgreSQL은 비SQL 표준을 제공합니다.statement_timestamp()그리고.clock_timestamp()트랜잭션 내에서 변경되는 경우가 있습니다.문서: https://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT

UTC 타임스탬프

는, UTC 의 입니다.func.utcnow()는 SQL Chemy 매뉴얼에 기재되어 있습니다.다만, 적절한 드라이버 고유의 기능을 스스로 제공할 필요가 있습니다.

DateTime에는 기본 키가 입력으로 설정되어 있지 않습니다.으로 해야 .Column이것을 시험해 보세요.

import datetime
from sqlalchemy import Column, Integer, DateTime
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Test(Base):
    __tablename__ = 'test'

    id = Column(Integer, primary_key=True)
    created_date = Column(DateTime, default=datetime.datetime.utcnow)

는 sqlalchemy로 .DateTime

from sqlalchemy.sql import func

DT = Column(DateTime(timezone=True), default=func.now())

도 아마 이 말을 쓰는 것이 것 요.onupdate=datetime.now UPDATE에 UPDATE도 변경됩니다.last_updatedsyslog.syslog.syslog.

SQL Chemy에는 python 실행 함수에 대한 두 가지 기본값이 있습니다.

  • defaultINSERT 값값 insert insert insert insert insert insert 。단 한 번만
  • onupdate는, UPDATE 의 콜 가능 결과도 설정합니다.

「 」의 default에 ''를 붙입니다.datetime.now:

from sqlalchemy import Column, Integer, DateTime
from datetime import datetime
class Test(Base):
     __tablename__ = 'test'
     id = Column(Integer, primary_key=True)
     created_at = Column(DateTime, default=datetime.now)
     updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now)                                                            

default칼럼

예:

Column(u'timestamp', TIMESTAMP(timezone=True), primary_key=False, nullable=False, default=time_now),

디폴트치는 콜 가능입니다.여기서 다음과 같이 정의했습니다.

from pytz import timezone
from datetime import datetime

UTC = timezone('UTC')

def time_now():
    return datetime.now(UTC)

Postgre에 따라SQL 문서:

now,CURRENT_TIMESTAMP,LOCALTIMESTAMP

이는 하나의 트랜잭션에 "현재" 시간의 일관된 개념을 갖게 하고, 동일한 트랜잭션 내의 여러 수정에 동일한 타임스탬프가 붙도록 하는 것을 목적으로 합니다.

를 사용하거나 트랜잭션 타임스탬프를 사용하지 않을 수 있습니다.

statement_timestamp()

는 현재 스테이트먼트의 시작 시각(구체적으로는 클라이언트로부터 최신 명령어메시지를 수신한 시각)을 반환합니다.스테이트먼트_개요

clock_timestamp()

는 실제 현재 시각을 반환하기 때문에 단일 SQL 명령 내에서도 값이 변경됩니다.

나에게 효과가 있었던 마리아답:

from sqlalchemy import Column, Integer, String, DateTime, TIMESTAMP, text
from sqlalchemy.sql import func
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Test(Base):
  __tablename__ = "test"

  id              = Column(Integer, primary_key=True, autoincrement=True)
  name            = Column(String(255), nullable=False)
  email           = Column(String(255), nullable=False)
  created_at      = Column(TIMESTAMP, nullable=False, server_default=func.now())
  updated_at      = Column(DateTime, server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"))

mariadb의 sqalchemy 문서에서는 다음 명령어를 Import할 것을 권장합니다.text하여 sqalchemy를 합니다.server_defaulttext이치노

updated_at=Column(DateTime, server_default=text("CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"))

자세한 내용은 sql 연금술 문서를 참조하십시오.

제가 어떤 식으로든 도움이 됐길 바랍니다.

Jeff Widman은 답변에서 UTC 타임스탬프 구현을 위해 직접 작성해야 한다고 말했습니다.func.utcnow()

제가 직접 구현하고 싶지 않았기 때문에 이미 많은 사람들이 작업을 하고 있는 python 패키지를 검색하여 찾았습니다.

패키지 이름은 spoqa/sqalchemy-ut 입니다.

패키지의 기능 개요는 다음과 같습니다.긴 이야기 요약하면 UtcDateTime은 다음과 같습니다.

만 채다datetime.datetime aware , " " " " 。datetime.datetime never never never never naigent , , , , , , , , , , , , , , , , , , ,datetime.datetime데이터베이스의 타임스탬프가 항상 UTC로 인코딩되어 예상대로 기능하도록 합니다.

「 」의 경우는, 을해 주세요.server_default=func.now() ★★★★★★★★★★★★★★★★★」func.now()방법: 설명:

Local_modified = Column(DateTime, server_default=func.now(), onupdate=func.now())

설정해야 요.DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPDDL을 사용하다

예를들면

create table test
(
    id int auto_increment
        primary key,
    source varchar(50) null,
    Local_modified datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
collate=utf8mb4_bin;

않으면, 「」가 됩니다.server_default=func.now(), onupdate=func.now()과가없없 없없없다다

언급URL : https://stackoverflow.com/questions/13370317/sqlalchemy-default-datetime

반응형