diff --git a/migrations/versions/007_change_telegram_id_to_bigint.py b/migrations/versions/007_change_telegram_id_to_bigint.py new file mode 100644 index 0000000..b3b5740 --- /dev/null +++ b/migrations/versions/007_change_telegram_id_to_bigint.py @@ -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 + ) diff --git a/src/core/models.py b/src/core/models.py index d30a870..6dfc85f 100644 --- a/src/core/models.py +++ b/src/core/models.py @@ -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))