fix: change telegram_id from INTEGER to BIGINT to support large bot IDs
Some checks reported errors
continuous-integration/drone/push Build encountered an error
Some checks reported errors
continuous-integration/drone/push Build encountered an error
- Add migration 007 to change users.telegram_id from INTEGER to BIGINT - Update User.telegram_id model to use BigInteger - Update BannedUser.telegram_id model to use BigInteger - Fixes asyncpg.exceptions.DataError: value 8300330445 out of int32 range - PostgreSQL INTEGER supports only -2.1B to 2.1B, but Telegram IDs can exceed this - BIGINT supports up to 9.2 quintillion, sufficient for all Telegram IDs
This commit is contained in:
71
migrations/versions/007_change_telegram_id_to_bigint.py
Normal file
71
migrations/versions/007_change_telegram_id_to_bigint.py
Normal file
@@ -0,0 +1,71 @@
|
||||
"""Change telegram_id from INTEGER to BIGINT
|
||||
|
||||
Revision ID: 007
|
||||
Revises: 006
|
||||
Create Date: 2025-11-17 06:10:00.000000
|
||||
|
||||
"""
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = '007'
|
||||
down_revision = '006'
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
"""
|
||||
Изменяем тип telegram_id с INTEGER (int32) на BIGINT (int64)
|
||||
для поддержки больших ID телеграм ботов (например, 8300330445).
|
||||
|
||||
PostgreSQL INTEGER поддерживает диапазон от -2,147,483,648 до 2,147,483,647.
|
||||
Telegram ID могут превышать это значение, что вызывает ошибку:
|
||||
"invalid input for query argument: value out of int32 range"
|
||||
|
||||
BIGINT поддерживает диапазон от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807.
|
||||
"""
|
||||
|
||||
# Изменяем telegram_id в таблице users
|
||||
op.alter_column(
|
||||
'users',
|
||||
'telegram_id',
|
||||
existing_type=sa.INTEGER(),
|
||||
type_=sa.BIGINT(),
|
||||
existing_nullable=False
|
||||
)
|
||||
|
||||
# Изменяем telegram_id в таблице banned_users
|
||||
op.alter_column(
|
||||
'banned_users',
|
||||
'telegram_id',
|
||||
existing_type=sa.INTEGER(),
|
||||
type_=sa.BIGINT(),
|
||||
existing_nullable=False
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
"""
|
||||
Откатываем изменения обратно на INTEGER.
|
||||
ВНИМАНИЕ: Если в базе есть значения > 2,147,483,647, откат не удастся!
|
||||
"""
|
||||
|
||||
# Откатываем telegram_id в таблице users
|
||||
op.alter_column(
|
||||
'users',
|
||||
'telegram_id',
|
||||
existing_type=sa.BIGINT(),
|
||||
type_=sa.INTEGER(),
|
||||
existing_nullable=False
|
||||
)
|
||||
|
||||
# Откатываем telegram_id в таблице banned_users
|
||||
op.alter_column(
|
||||
'banned_users',
|
||||
'telegram_id',
|
||||
existing_type=sa.BIGINT(),
|
||||
type_=sa.INTEGER(),
|
||||
existing_nullable=False
|
||||
)
|
||||
@@ -1,4 +1,4 @@
|
||||
from sqlalchemy import Column, Integer, String, DateTime, Boolean, ForeignKey, Text, JSON, UniqueConstraint
|
||||
from sqlalchemy import Column, Integer, String, DateTime, Boolean, ForeignKey, Text, JSON, UniqueConstraint, BigInteger
|
||||
from sqlalchemy.orm import relationship
|
||||
from datetime import datetime, timezone
|
||||
from .database import Base
|
||||
@@ -10,7 +10,7 @@ class User(Base):
|
||||
__tablename__ = "users"
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
telegram_id = Column(Integer, unique=True, nullable=False, index=True)
|
||||
telegram_id = Column(BigInteger, unique=True, nullable=False, index=True)
|
||||
username = Column(String(255))
|
||||
first_name = Column(String(255))
|
||||
last_name = Column(String(255))
|
||||
@@ -180,7 +180,7 @@ class BannedUser(Base):
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
|
||||
telegram_id = Column(Integer, nullable=False, index=True)
|
||||
telegram_id = Column(BigInteger, nullable=False, index=True)
|
||||
banned_by = Column(Integer, ForeignKey("users.id"), nullable=False)
|
||||
reason = Column(Text, nullable=True)
|
||||
banned_at = Column(DateTime(timezone=True), default=lambda: datetime.now(timezone.utc))
|
||||
|
||||
Reference in New Issue
Block a user