"""init: 27 tables Revision ID: d659ecc1b6e7 Revises: Create Date: 2026-10-15 09:21:58.395583 """ from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import mysql revision = 'd659ecc1b6e7' down_revision = None branch_labels = None depends_on = None def upgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### op.create_table('admin_logs', sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False), sa.Column('admin_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('action', sa.String(length=50), nullable=False), sa.Column('target', sa.String(length=100), nullable=False), sa.Column('detail', sa.String(length=1000), nullable=False), sa.Column('ip', sa.String(length=45), nullable=False), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('id') ) op.create_index('idx_admin_created', 'admin_logs', ['admin_id', 'created_at'], unique=False) op.create_table('admin_users', sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False), sa.Column('username', sa.String(length=50), nullable=False), sa.Column('password_hash', sa.String(length=255), nullable=False), sa.Column('name', sa.String(length=50), nullable=False), sa.Column('role', sa.String(length=20), nullable=False, comment='super/reviewer/operator'), sa.Column('status', sa.SmallInteger(), nullable=False, comment='1正常 0禁用'), sa.Column('last_login_at', sa.DateTime(), nullable=True), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('username') ) op.create_table('asset_transactions', sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False), sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('change_amount', sa.Numeric(precision=12, scale=1), nullable=False), sa.Column('balance_after', sa.Numeric(precision=12, scale=1), nullable=False), sa.Column('biz_type', sa.SmallInteger(), nullable=False, comment='1充值返利 2完整观看 3点赞 4提现 5提现退回 6返利扣回 7后台调整'), sa.Column('biz_id', sa.String(length=64), nullable=False), sa.Column('remark', sa.String(length=200), nullable=False), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('id') ) op.create_index('idx_biz', 'asset_transactions', ['biz_type', 'biz_id'], unique=False) op.create_index('idx_user_created', 'asset_transactions', ['user_id', 'created_at'], unique=False) op.create_table('asset_wallets', sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('assets', sa.Numeric(precision=12, scale=1), nullable=False, comment='当前资产(允许为负)'), sa.Column('total_earned', sa.Numeric(precision=14, scale=1), nullable=False), sa.Column('total_withdrawn', sa.Numeric(precision=14, scale=1), nullable=False), sa.Column('version', sa.Integer(), nullable=False), sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('user_id') ) op.create_table('categories', sa.Column('id', mysql.INTEGER(unsigned=True), autoincrement=True, nullable=False), sa.Column('name', sa.String(length=50), nullable=False), sa.Column('sort', sa.Integer(), nullable=False), sa.Column('status', sa.SmallInteger(), nullable=False, comment='1启用 0停用'), sa.PrimaryKeyConstraint('id') ) op.create_table('comments', sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False), sa.Column('video_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('parent_id', mysql.BIGINT(unsigned=True), nullable=False, comment='0=一级评论'), sa.Column('reply_to_user_id', mysql.BIGINT(unsigned=True), nullable=True), sa.Column('content', sa.String(length=500), nullable=False), sa.Column('like_count', sa.Integer(), nullable=False), sa.Column('status', sa.SmallInteger(), nullable=False, comment='1正常 2已删除 3审核中'), sa.Column('reward_counted', sa.SmallInteger(), nullable=False, comment='是否已计入评论奖励进度'), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('id') ) op.create_index('idx_user_video', 'comments', ['user_id', 'video_id'], unique=False) op.create_index('idx_video', 'comments', ['video_id', 'status', 'created_at'], unique=False) op.create_table('favorites', sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False), sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('video_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('id') ) op.create_index('idx_video', 'favorites', ['video_id'], unique=False) op.create_index('uk_user_video', 'favorites', ['user_id', 'video_id'], unique=True) op.create_table('likes', sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False), sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('video_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('id') ) op.create_index('idx_video', 'likes', ['video_id'], unique=False) op.create_index('uk_user_video', 'likes', ['user_id', 'video_id'], unique=True) op.create_table('notifications', sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False), sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False, comment='接收人'), sa.Column('type', sa.SmallInteger(), nullable=False, comment='1审核结果 2提现进度 3系统公告 4评论回复'), sa.Column('title', sa.String(length=100), nullable=False), sa.Column('content', sa.String(length=500), nullable=False), sa.Column('biz_id', sa.String(length=64), nullable=False), sa.Column('is_read', sa.SmallInteger(), nullable=False), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('id') ) op.create_index('idx_user_read', 'notifications', ['user_id', 'is_read', 'id'], unique=False) op.create_table('point_transactions', sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False), sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('change_amount', sa.Integer(), nullable=False, comment='正增负减'), sa.Column('balance_after', sa.Integer(), nullable=False), sa.Column('biz_type', sa.SmallInteger(), nullable=False, comment='1充值 2观看 3评论奖励 4会员 5赠送 6调整 7扣回 8推荐奖励'), sa.Column('biz_id', sa.String(length=64), nullable=False), sa.Column('remark', sa.String(length=200), nullable=False), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('id') ) op.create_index('idx_biz', 'point_transactions', ['biz_type', 'biz_id'], unique=False) op.create_index('idx_user_created', 'point_transactions', ['user_id', 'created_at'], unique=False) op.create_table('recharge_orders', sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False), sa.Column('order_no', sa.String(length=32), nullable=False), sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('amount_fen', sa.Integer(), nullable=False, comment='人民币金额(分)'), sa.Column('points', sa.Integer(), nullable=False, comment='应到账积分'), sa.Column('pay_method', sa.SmallInteger(), nullable=False, comment='1支付宝 2微信 3USDT'), sa.Column('status', sa.SmallInteger(), nullable=False, comment='0待支付 1已支付 2已关闭 3已退款'), sa.Column('third_trade_no', sa.String(length=64), nullable=True), sa.Column('usdt_amount', sa.Numeric(precision=18, scale=6), nullable=True), sa.Column('usdt_rate', sa.Numeric(precision=10, scale=4), nullable=True), sa.Column('paid_at', sa.DateTime(), nullable=True), sa.Column('expire_at', sa.DateTime(), nullable=False), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('order_no'), sa.UniqueConstraint('third_trade_no') ) op.create_index('idx_user_status', 'recharge_orders', ['user_id', 'status'], unique=False) op.create_table('recharge_packages', sa.Column('id', mysql.INTEGER(unsigned=True), autoincrement=True, nullable=False), sa.Column('amount_yuan', sa.Integer(), nullable=False), sa.Column('points', sa.Integer(), nullable=False, comment='基础积分=金额x汇率'), sa.Column('bonus_points', sa.Integer(), nullable=False), sa.Column('sort', sa.Integer(), nullable=False), sa.Column('status', sa.SmallInteger(), nullable=False, comment='1上架 0下架'), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('id') ) op.create_table('referrals', sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False), sa.Column('inviter_id', mysql.BIGINT(unsigned=True), nullable=False, comment='推荐人'), sa.Column('invitee_id', mysql.BIGINT(unsigned=True), nullable=False, comment='被推荐人'), sa.Column('invite_code', sa.String(length=10), nullable=False), sa.Column('status', sa.SmallInteger(), nullable=False, comment='0待激活 1有效 2无效 3风控冻结'), sa.Column('risk_flag', sa.String(length=50), nullable=False), sa.Column('register_ip', sa.String(length=45), nullable=False), sa.Column('activated_at', sa.DateTime(), nullable=True), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('id') ) op.create_index('idx_inviter', 'referrals', ['inviter_id', 'created_at'], unique=False) op.create_index('idx_status', 'referrals', ['status', 'created_at'], unique=False) op.create_index('uk_invitee', 'referrals', ['invitee_id'], unique=True) op.create_table('reports', sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False), sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False, comment='举报人'), sa.Column('target_type', sa.SmallInteger(), nullable=False, comment='1视频 2评论'), sa.Column('target_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('reason_type', sa.SmallInteger(), nullable=False, comment='1色情低俗 2暴力血腥 3侵权 4广告营销 5其他'), sa.Column('remark', sa.String(length=200), nullable=False), sa.Column('status', sa.SmallInteger(), nullable=False, comment='0待处理 1已处理 2已驳回'), sa.Column('handle_result', sa.String(length=50), nullable=False), sa.Column('admin_id', mysql.BIGINT(unsigned=True), nullable=True), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.Column('handled_at', sa.DateTime(), nullable=True), sa.PrimaryKeyConstraint('id') ) op.create_index('idx_status', 'reports', ['status', 'created_at'], unique=False) op.create_index('uk_user_target', 'reports', ['user_id', 'target_type', 'target_id'], unique=True) op.create_table('sensitive_words', sa.Column('id', mysql.INTEGER(unsigned=True), autoincrement=True, nullable=False), sa.Column('word', sa.String(length=50), nullable=False), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('word') ) op.create_table('system_configs', sa.Column('config_key', sa.String(length=50), nullable=False), sa.Column('config_value', sa.String(length=500), nullable=False), sa.Column('description', sa.String(length=200), nullable=False), sa.Column('updated_by', mysql.BIGINT(unsigned=True), nullable=True), sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('config_key') ) op.create_table('tags', sa.Column('id', mysql.INTEGER(unsigned=True), autoincrement=True, nullable=False), sa.Column('name', sa.String(length=20), nullable=False), sa.Column('video_count', sa.Integer(), nullable=False, comment='冗余'), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('name') ) op.create_table('transcode_tasks', sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False), sa.Column('video_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('source_url', sa.String(length=500), nullable=False), sa.Column('task_status', sa.SmallInteger(), nullable=False, comment='0排队 1转码中 2成功 3失败'), sa.Column('priority', sa.SmallInteger(), nullable=False, comment='0普通 1优先(会员)'), sa.Column('retry_count', sa.Integer(), nullable=False), sa.Column('error_msg', sa.String(length=500), nullable=False), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('id') ) op.create_index('idx_pick', 'transcode_tasks', ['task_status', 'priority', 'created_at'], unique=False) op.create_table('users', sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False), sa.Column('phone', sa.String(length=20), nullable=True, comment='手机号'), sa.Column('email', sa.String(length=100), nullable=True, comment='邮箱'), sa.Column('password_hash', sa.String(length=255), nullable=False), sa.Column('nickname', sa.String(length=50), nullable=False), sa.Column('avatar_url', sa.String(length=500), nullable=False), sa.Column('gender', sa.SmallInteger(), nullable=False, comment='0未知 1男 2女'), sa.Column('bio', sa.String(length=200), nullable=False), sa.Column('status', sa.SmallInteger(), nullable=False, comment='1正常 2封禁 3已注销'), sa.Column('register_type', sa.SmallInteger(), nullable=False, comment='1手机 2邮箱'), sa.Column('invite_code', sa.String(length=10), nullable=False, comment='我的邀请码'), sa.Column('register_ip', sa.String(length=45), nullable=False), sa.Column('last_login_at', sa.DateTime(), nullable=True), sa.Column('last_login_ip', sa.String(length=45), nullable=False), sa.Column('deactivate_at', sa.DateTime(), nullable=True, comment='注销发起时间(7天冻结期)'), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('email'), sa.UniqueConstraint('invite_code'), sa.UniqueConstraint('phone') ) op.create_index('idx_status_created', 'users', ['status', 'created_at'], unique=False) op.create_table('video_earnings', sa.Column('video_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('author_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('complete_views', sa.Integer(), nullable=False, comment='累计完整观看次数'), sa.Column('views_settled', sa.Integer(), nullable=False, comment='已结算的完整观看刻度'), sa.Column('likes_accrued', sa.Integer(), nullable=False, comment='累计点赞(取消会回退)'), sa.Column('likes_settled', sa.Integer(), nullable=False, comment='已结算的点赞刻度'), sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('video_id') ) op.create_index('idx_author', 'video_earnings', ['author_id'], unique=False) op.create_table('video_tags', sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False), sa.Column('video_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('tag_id', mysql.INTEGER(unsigned=True), nullable=False), sa.PrimaryKeyConstraint('id') ) op.create_index('idx_tag', 'video_tags', ['tag_id', 'video_id'], unique=False) op.create_index('uk_video_tag', 'video_tags', ['video_id', 'tag_id'], unique=True) op.create_table('videos', sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False), sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False, comment='作者'), sa.Column('category_id', sa.Integer(), nullable=False), sa.Column('title', sa.String(length=100), nullable=False), sa.Column('description', sa.String(length=500), nullable=False), sa.Column('cover_url', sa.String(length=500), nullable=False), sa.Column('video_url', sa.String(length=500), nullable=False, comment='m3u8地址'), sa.Column('duration', sa.Integer(), nullable=False, comment='秒'), sa.Column('file_size', sa.BigInteger(), nullable=False), sa.Column('width', sa.Integer(), nullable=False), sa.Column('height', sa.Integer(), nullable=False), sa.Column('status', sa.SmallInteger(), nullable=False, comment='0转码中 1待审核 2已发布 3拒绝 4下架 5转码失败/已删除'), sa.Column('reject_reason', sa.String(length=200), nullable=False), sa.Column('reviewer_id', mysql.BIGINT(unsigned=True), nullable=True), sa.Column('reviewed_at', sa.DateTime(), nullable=True), sa.Column('is_priority', sa.SmallInteger(), nullable=False), sa.Column('view_count', sa.BigInteger(), nullable=False), sa.Column('like_count', sa.Integer(), nullable=False), sa.Column('comment_count', sa.Integer(), nullable=False), sa.Column('favorite_count', sa.Integer(), nullable=False), sa.Column('published_at', sa.DateTime(), nullable=True), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('id') ) op.create_index('idx_category', 'videos', ['category_id', 'status'], unique=False) op.create_index('idx_feed', 'videos', ['status', 'published_at'], unique=False) op.create_index('idx_user_status', 'videos', ['user_id', 'status'], unique=False) op.create_table('watch_records', sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False), sa.Column('subject_type', sa.SmallInteger(), nullable=False, comment='1用户 2游客'), sa.Column('subject_id', sa.String(length=64), nullable=False, comment='user_id或device_id'), sa.Column('video_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('watch_date', sa.Date(), nullable=False), sa.Column('cost_type', sa.SmallInteger(), nullable=False, comment='0免费 1积分 2会员 3本人'), sa.Column('cost_points', sa.Integer(), nullable=False), sa.Column('watch_duration', sa.Integer(), nullable=False, comment='秒'), sa.Column('position', sa.Integer(), nullable=False, comment='最后播放进度(秒),续播用'), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.PrimaryKeyConstraint('id') ) op.create_index('idx_subject', 'watch_records', ['subject_type', 'subject_id', 'created_at'], unique=False) op.create_index('uk_dedup', 'watch_records', ['subject_type', 'subject_id', 'video_id', 'watch_date'], unique=True) op.create_table('withdrawals', sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False), sa.Column('withdraw_no', sa.String(length=32), nullable=False), sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('assets', sa.Numeric(precision=12, scale=1), nullable=False), sa.Column('amount_fen', sa.Integer(), nullable=False, comment='折合人民币(分)'), sa.Column('channel', sa.SmallInteger(), nullable=False, comment='1支付宝 2微信 3USDT'), sa.Column('account', sa.String(length=200), nullable=False), sa.Column('status', sa.SmallInteger(), nullable=False, comment='0待审核 1已打款 2已拒绝'), sa.Column('reason', sa.String(length=200), nullable=False), sa.Column('admin_id', mysql.BIGINT(unsigned=True), nullable=True), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.Column('processed_at', sa.DateTime(), nullable=True), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('withdraw_no') ) op.create_index('idx_status', 'withdrawals', ['status', 'created_at'], unique=False) op.create_index('idx_user', 'withdrawals', ['user_id', 'created_at'], unique=False) op.create_table('membership_orders', sa.Column('id', mysql.BIGINT(unsigned=True), autoincrement=True, nullable=False), sa.Column('order_no', sa.String(length=32), nullable=False), sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('plan_code', sa.String(length=20), nullable=False, comment='trial/month/year/lifetime'), sa.Column('points_cost', sa.Integer(), nullable=False, comment='赠送为 0'), sa.Column('duration_days', sa.Integer(), nullable=False, comment='0=终身'), sa.Column('start_at', sa.DateTime(), nullable=False), sa.Column('end_at', sa.DateTime(), nullable=True, comment='终身为 NULL'), sa.Column('source', sa.SmallInteger(), nullable=False, comment='1积分购买 2活动赠送'), sa.Column('created_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('order_no') ) op.create_index('idx_user', 'membership_orders', ['user_id', 'created_at'], unique=False) op.create_table('user_membership', sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('is_member', sa.SmallInteger(), nullable=False), sa.Column('current_plan', sa.String(length=20), nullable=False, comment='trial/month/year/lifetime'), sa.Column('is_lifetime', sa.SmallInteger(), nullable=False), sa.Column('expire_at', sa.DateTime(), nullable=True, comment='终身卡为 NULL'), sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), sa.PrimaryKeyConstraint('user_id') ) op.create_table('user_wallets', sa.Column('user_id', mysql.BIGINT(unsigned=True), nullable=False), sa.Column('points', mysql.INTEGER(unsigned=True), nullable=False), sa.Column('total_recharge', mysql.INTEGER(unsigned=True), nullable=False), sa.Column('total_earned', mysql.INTEGER(unsigned=True), nullable=False), sa.Column('total_consumed', mysql.INTEGER(unsigned=True), nullable=False), sa.Column('version', sa.Integer(), nullable=False, comment='乐观锁'), sa.Column('updated_at', sa.DateTime(), server_default=sa.text('now()'), nullable=False), sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), sa.PrimaryKeyConstraint('user_id') ) # ### end Alembic commands ### def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### op.drop_table('user_wallets') op.drop_table('user_membership') op.drop_index('idx_user', table_name='membership_orders') op.drop_table('membership_orders') op.drop_index('idx_user', table_name='withdrawals') op.drop_index('idx_status', table_name='withdrawals') op.drop_table('withdrawals') op.drop_index('uk_dedup', table_name='watch_records') op.drop_index('idx_subject', table_name='watch_records') op.drop_table('watch_records') op.drop_index('idx_user_status', table_name='videos') op.drop_index('idx_feed', table_name='videos') op.drop_index('idx_category', table_name='videos') op.drop_table('videos') op.drop_index('uk_video_tag', table_name='video_tags') op.drop_index('idx_tag', table_name='video_tags') op.drop_table('video_tags') op.drop_index('idx_author', table_name='video_earnings') op.drop_table('video_earnings') op.drop_index('idx_status_created', table_name='users') op.drop_table('users') op.drop_index('idx_pick', table_name='transcode_tasks') op.drop_table('transcode_tasks') op.drop_table('tags') op.drop_table('system_configs') op.drop_table('sensitive_words') op.drop_index('uk_user_target', table_name='reports') op.drop_index('idx_status', table_name='reports') op.drop_table('reports') op.drop_index('uk_invitee', table_name='referrals') op.drop_index('idx_status', table_name='referrals') op.drop_index('idx_inviter', table_name='referrals') op.drop_table('referrals') op.drop_table('recharge_packages') op.drop_index('idx_user_status', table_name='recharge_orders') op.drop_table('recharge_orders') op.drop_index('idx_user_created', table_name='point_transactions') op.drop_index('idx_biz', table_name='point_transactions') op.drop_table('point_transactions') op.drop_index('idx_user_read', table_name='notifications') op.drop_table('notifications') op.drop_index('uk_user_video', table_name='likes') op.drop_index('idx_video', table_name='likes') op.drop_table('likes') op.drop_index('uk_user_video', table_name='favorites') op.drop_index('idx_video', table_name='favorites') op.drop_table('favorites') op.drop_index('idx_video', table_name='comments') op.drop_index('idx_user_video', table_name='comments') op.drop_table('comments') op.drop_table('categories') op.drop_table('asset_wallets') op.drop_index('idx_user_created', table_name='asset_transactions') op.drop_index('idx_biz', table_name='asset_transactions') op.drop_table('asset_transactions') op.drop_table('admin_users') op.drop_index('idx_admin_created', table_name='admin_logs') op.drop_table('admin_logs') # ### end Alembic commands ###