Skip to content

fix: serialize credential expiry to ISO string for PostgreSQL/asyncpg compatibility - #444

Merged
su-kaka merged 1 commit into
su-kaka:masterfrom
neptalu0:fix-postgres-expiry
Oct 28, 2026
Merged

su-kaka merged 1 commit into
su-kaka:masterfrom
neptalu0:fix-postgres-expiry

Conversation

@neptalu0

Copy link
Copy Markdown

修复问题 / Problem

在配置了 POSTGRESQL_URI(使用 asyncpg 驱动)的环境下,后台刷新 Token (refresh_token) 时会报错 HTTP 500,错误日志如下:

[ERROR] Token刷新失败 xxx@gmail.com: (sqlalchemy.dialects.postgresql.asyncpg.Error) 
invalid input for query argument $2: datetime.datetime(...) (expected str, got datetime)
[SQL: UPDATE antigravity_credentials SET access_token=$1::VARCHAR, expiry=$2::VARCHAR, updated_at=$3::FLOAT WHERE antigravity_credentials.id = $4::INTEGER]

原因分析 / Cause

  1. 在 src/storage/database.py 中,AntigravityCredential.expiry 字段定义为 Mapped[str] = mapped_column(Text)。
  2. 在 src/credential_manager.py 的 refresh_token 函数中,credential_data["expiry"] = creds.expires_at 直接传入了 datetime.datetime 对象。
  3. asyncpg 对 SQL 参数类型要求严格,当检测到目标列为 VARCHAR/Text 时,传入 datetime.datetime 会抛出类型不匹配异常。

解决方案 / Solution

  • 在 src/credential_manager.py 中,将 creds.expires_at 统一转换为 .isoformat() 字符串(与其他模块如 src/auth.py 和 src/google_oauth_api.py 逻辑保持一致)。
  • 在 src/storage/database.py 的 store_credential 中增加兼容性兜底,确保入库的 expiry 始终为字符串。
  • 完全向后兼容 SQLite 和其他存储后端。

感谢作者的开源重构工作!❤️

@su-kaka
su-kaka merged commit f2009a6 into su-kaka:master Oct 28, 2026
@neptalu0
neptalu0 deleted the fix-postgres-expiry branch October 31, 2026 16:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants