| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- """Read the latest article visualization HTML from the external AIGC database."""
- from __future__ import annotations
- from functools import lru_cache
- from typing import Any
- from sqlalchemy import create_engine, text
- from sqlalchemy.pool import QueuePool
- from supply_infra.config import get_infra_settings
- @lru_cache(maxsize=1)
- def _get_aigc_readonly_engine() -> Any:
- settings = get_infra_settings()
- if not all(
- (
- settings.aigc_readonly_mysql_host,
- settings.aigc_readonly_mysql_user,
- settings.aigc_readonly_mysql_database,
- )
- ):
- raise RuntimeError("AIGC read-only MySQL connection is not configured")
- return create_engine(
- settings.aigc_readonly_mysql_url,
- poolclass=QueuePool,
- pool_size=2,
- max_overflow=0,
- pool_timeout=10,
- pool_recycle=1800,
- pool_pre_ping=True,
- connect_args={
- "connect_timeout": 10,
- "read_timeout": 30,
- "write_timeout": 30,
- },
- )
- def get_latest_article_html(channel_content_id: str) -> str | None:
- statement = text(
- """
- SELECT t2.html
- FROM aigc_task_input_usage t1
- JOIN aigc_task_callback_data t2
- ON t2.task_instance_id = t1.task_instance_id
- WHERE t1.biz_unique_id = :channel_content_id
- ORDER BY t2.id DESC
- LIMIT 1
- """
- )
- with _get_aigc_readonly_engine().connect() as connection:
- value = connection.scalar(
- statement,
- {"channel_content_id": channel_content_id},
- )
- if value is None:
- return None
- if isinstance(value, bytes):
- return value.decode("utf-8", errors="replace")
- return str(value)
|