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
This commit is contained in:
chiguyong 2026-06-01 21:26:39 +08:00
parent eabd23d093
commit d5f752f419
5 changed files with 21 additions and 9 deletions

View File

@ -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

View File

@ -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]

View File

@ -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))

View File

@ -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())

View File

@ -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: