From d5f752f41911264a6a76b3ca2e0fcb592adf10cb Mon Sep 17 00:00:00 2001 From: chiguyong Date: Mon, 1 Jun 2026 21:26:39 +0800 Subject: [PATCH] fix: add DateTime(timezone=True) to analytics.py (4 columns), update migration and port config - analytics.py: 4 DateTime columns now timezone-aware (99 total, 0 remaining) - Migration script updated with publish_records, content_metrics, optimization_insights - Docker Compose: db port 5433, redis port 6380 (avoid conflicts with fischerx) - .env files: DATABASE_URL and REDIS_URL updated to new ports - alembic.ini: updated to localhost:5433 --- backend/.env.example | 4 ++-- backend/alembic.ini | 2 +- ...3i4j5k6mn78_add_timezone_to_all_datetime_columns.py | 10 ++++++++++ backend/app/models/analytics.py | 10 ++++++---- docker-compose.yml | 4 ++-- 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/backend/.env.example b/backend/.env.example index 27e27db..faedbd7 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -55,12 +55,12 @@ ENABLE_LLM=true # ============================================================ # 数据库配置 # ============================================================ -DATABASE_URL=postgresql+asyncpg://postgres:postgres123@localhost:5432/geo_platform +DATABASE_URL=postgresql+asyncpg://postgres:postgres123@localhost:5433/geo_platform # ============================================================ # Redis 配置 # ============================================================ -REDIS_URL=redis://localhost:6379/0 +REDIS_URL=redis://localhost:6380/0 # 是否启用Redis缓存 ENABLE_REDIS=true diff --git a/backend/alembic.ini b/backend/alembic.ini index 79339d6..7ab8a55 100644 --- a/backend/alembic.ini +++ b/backend/alembic.ini @@ -86,7 +86,7 @@ path_separator = os # database URL. This is consumed by the user-maintained env.py script only. # other means of configuring database URLs may be customized within the env.py # file. -sqlalchemy.url = postgresql+asyncpg://postgres:postgres123@db:5432/geo_platform +sqlalchemy.url = postgresql+asyncpg://postgres:postgres123@127.0.0.1:5433/geo_platform [post_write_hooks] diff --git a/backend/alembic/versions/h3i4j5k6mn78_add_timezone_to_all_datetime_columns.py b/backend/alembic/versions/h3i4j5k6mn78_add_timezone_to_all_datetime_columns.py index 84e005f..c03d29f 100644 --- a/backend/alembic/versions/h3i4j5k6mn78_add_timezone_to_all_datetime_columns.py +++ b/backend/alembic/versions/h3i4j5k6mn78_add_timezone_to_all_datetime_columns.py @@ -141,6 +141,11 @@ def upgrade() -> None: op.alter_column('diagnosis_records', 'created_at', type_=sa.DateTime(timezone=True), existing_type=sa.DateTime(), postgresql_using='created_at AT TIME ZONE \'UTC\'') op.alter_column('diagnosis_records', 'completed_at', type_=sa.DateTime(timezone=True), existing_type=sa.DateTime(), postgresql_using='completed_at AT TIME ZONE \'UTC\'') + op.alter_column('publish_records', 'published_at', type_=sa.DateTime(timezone=True), existing_type=sa.DateTime(), postgresql_using='published_at AT TIME ZONE \'UTC\'') + op.alter_column('publish_records', 'created_at', type_=sa.DateTime(timezone=True), existing_type=sa.DateTime(), postgresql_using='created_at AT TIME ZONE \'UTC\'') + op.alter_column('content_metrics', 'recorded_at', type_=sa.DateTime(timezone=True), existing_type=sa.DateTime(), postgresql_using='recorded_at AT TIME ZONE \'UTC\'') + op.alter_column('optimization_insights', 'created_at', type_=sa.DateTime(timezone=True), existing_type=sa.DateTime(), postgresql_using='created_at AT TIME ZONE \'UTC\'') + def downgrade() -> None: op.alter_column('users', 'lastLoginAt', type_=sa.DateTime(), existing_type=sa.DateTime(timezone=True)) @@ -266,3 +271,8 @@ def downgrade() -> None: op.alter_column('diagnosis_records', 'created_at', type_=sa.DateTime(), existing_type=sa.DateTime(timezone=True)) op.alter_column('diagnosis_records', 'completed_at', type_=sa.DateTime(), existing_type=sa.DateTime(timezone=True)) + + op.alter_column('publish_records', 'published_at', type_=sa.DateTime(), existing_type=sa.DateTime(timezone=True)) + op.alter_column('publish_records', 'created_at', type_=sa.DateTime(), existing_type=sa.DateTime(timezone=True)) + op.alter_column('content_metrics', 'recorded_at', type_=sa.DateTime(), existing_type=sa.DateTime(timezone=True)) + op.alter_column('optimization_insights', 'created_at', type_=sa.DateTime(), existing_type=sa.DateTime(timezone=True)) diff --git a/backend/app/models/analytics.py b/backend/app/models/analytics.py index ddcbe38..ccd3897 100644 --- a/backend/app/models/analytics.py +++ b/backend/app/models/analytics.py @@ -16,8 +16,8 @@ class PublishRecord(Base): platform: Mapped[str] = mapped_column(String(50)) # wechat/zhihu/xiaohongshu... published_url: Mapped[str | None] = mapped_column(String(500), nullable=True) status: Mapped[str] = mapped_column(String(20), default="draft") # draft/published/archived - published_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True) - created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now()) + published_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) metrics: Mapped[list["ContentMetrics"]] = relationship(back_populates="publish_record") @@ -27,7 +27,7 @@ class ContentMetrics(Base): id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid.uuid4())) publish_record_id: Mapped[str] = mapped_column(String(36), ForeignKey("publish_records.id")) - recorded_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now()) + recorded_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) # 互动指标 views: Mapped[int] = mapped_column(Integer, default=0) @@ -60,4 +60,6 @@ class OptimizationInsight(Base): recommendation: Mapped[str] = mapped_column(Text) severity: Mapped[str] = mapped_column(String(20), default="info") # info/warning/success applied: Mapped[bool] = mapped_column(Boolean, default=False) - created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now()) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) + + diff --git a/docker-compose.yml b/docker-compose.yml index 7c14848..05f505a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,7 +10,7 @@ services: POSTGRES_PASSWORD: postgres123 POSTGRES_DB: geo_platform ports: - - "5432:5432" + - "5433:5432" volumes: - postgres_data:/var/lib/postgresql/data - ./backend/init-db.sh:/docker-entrypoint-initdb.d/01-install-pgvector.sh @@ -32,7 +32,7 @@ services: container_name: geo_redis restart: unless-stopped ports: - - "6379:6379" + - "6380:6379" volumes: - redis_data:/data healthcheck: