From 597d6299544326f02dc4d9a5063b1b4e04aba2bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=ADITQ?= Date: Thu, 21 Mar 2024 18:33:46 +0300 Subject: [PATCH] chore: Small improvements in database structure --- .../versions/50fa8edaaf94_added_user_model.py | 42 +++++++++++++++++++ .../versions/5896f08fbd61_added_user_model.py | 42 ------------------- app/models/user.py | 14 ++++++- 3 files changed, 55 insertions(+), 43 deletions(-) create mode 100644 app/migrations/versions/50fa8edaaf94_added_user_model.py delete mode 100644 app/migrations/versions/5896f08fbd61_added_user_model.py diff --git a/app/migrations/versions/50fa8edaaf94_added_user_model.py b/app/migrations/versions/50fa8edaaf94_added_user_model.py new file mode 100644 index 0000000..152235f --- /dev/null +++ b/app/migrations/versions/50fa8edaaf94_added_user_model.py @@ -0,0 +1,42 @@ +"""Added user model + +Revision ID: 50fa8edaaf94 +Revises: +Create Date: 2024-03-21 18:31:15.864426 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '50fa8edaaf94' +down_revision: Union[str, None] = None +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('users', + sa.Column('telegram_id', sa.BigInteger(), nullable=False), + sa.Column('username', sa.String(length=20), nullable=False), + sa.Column('age', sa.SmallInteger(), nullable=False), + sa.Column('bio', sa.String(length=100), nullable=True), + sa.Column('sex', sa.String(length=6), nullable=True), + sa.Column('country', sa.Text(), nullable=False), + sa.Column('city', sa.Text(), nullable=False), + sa.PrimaryKeyConstraint('telegram_id'), + sa.UniqueConstraint('username') + ) + op.create_index(op.f('ix_users_telegram_id'), 'users', ['telegram_id'], unique=False) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f('ix_users_telegram_id'), table_name='users') + op.drop_table('users') + # ### end Alembic commands ### diff --git a/app/migrations/versions/5896f08fbd61_added_user_model.py b/app/migrations/versions/5896f08fbd61_added_user_model.py deleted file mode 100644 index c6769c4..0000000 --- a/app/migrations/versions/5896f08fbd61_added_user_model.py +++ /dev/null @@ -1,42 +0,0 @@ -"""Added User model - -Revision ID: 5896f08fbd61 -Revises: -Create Date: 2024-03-19 23:25:50.458639 - -""" - -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision: str = '5896f08fbd61' -down_revision: Union[str, None] = None -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.create_table( - 'users', - sa.Column('telegram_id', sa.Integer(), nullable=False), - sa.Column('username', sa.String(length=20), nullable=False), - sa.Column('age', sa.SmallInteger(), nullable=False), - sa.Column('bio', sa.String(length=100), nullable=True), - sa.Column('sex', sa.String(length=6), nullable=True), - sa.Column('country', sa.Text(), nullable=False), - sa.Column('city', sa.Text(), nullable=False), - sa.PrimaryKeyConstraint('telegram_id'), - sa.UniqueConstraint('username'), - ) - # ### end Alembic commands ### - - -def downgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.drop_table('users') - # ### end Alembic commands ### diff --git a/app/models/user.py b/app/models/user.py index 119e88f..582ab35 100644 --- a/app/models/user.py +++ b/app/models/user.py @@ -17,7 +17,7 @@ Base: Any = declarative_base() class User(Base): __tablename__ = "users" - telegram_id = sa.Column(sa.Integer, primary_key=True) + telegram_id = sa.Column(sa.BigInteger, primary_key=True, index=True) username = sa.Column(sa.String(20), nullable=False, unique=True) age = sa.Column(sa.SmallInteger, nullable=False) bio = sa.Column(sa.String(100), nullable=True) @@ -35,6 +35,9 @@ class User(Base): re.match(regex_pattern, value) is not None ), "a-z, A-Z, 0-9, _ only allowed in username." + if session.query(User).filter(User.username == value).first(): + raise AssertionError("Username is already taken.") + return value @validates("age") @@ -53,6 +56,15 @@ class User(Base): return value + @validates("sex") + def validate_sex(self, key, value): + assert value in [ + "male", + "female", + ], "Invalid input. Please try again." + + return value + @validates("country") def validate_country(self, key, value): verdict, normalized_value = geo.validate_country(