35 lines
1.0 KiB
Python
35 lines
1.0 KiB
Python
|
|
"""Alembic 迁移共享工具(仅用于 versions/ 下的迁移脚本)。"""
|
|||
|
|
|
|||
|
|
from __future__ import annotations
|
|||
|
|
|
|||
|
|
import sqlalchemy as sa
|
|||
|
|
from alembic import op
|
|||
|
|
|
|||
|
|
|
|||
|
|
def table_exists(table_name: str) -> bool:
|
|||
|
|
bind = op.get_bind()
|
|||
|
|
return table_name in sa.inspect(bind).get_table_names()
|
|||
|
|
|
|||
|
|
|
|||
|
|
def has_column(table_name: str, column_name: str) -> bool:
|
|||
|
|
if not table_exists(table_name):
|
|||
|
|
return False
|
|||
|
|
bind = op.get_bind()
|
|||
|
|
columns = sa.inspect(bind).get_columns(table_name)
|
|||
|
|
return any(column["name"] == column_name for column in columns)
|
|||
|
|
|
|||
|
|
|
|||
|
|
def add_column_if_missing(table_name: str, column: sa.Column) -> bool:
|
|||
|
|
"""若列不存在则 add_column;返回是否执行了添加。"""
|
|||
|
|
if has_column(table_name, column.name):
|
|||
|
|
return False
|
|||
|
|
op.add_column(table_name, column)
|
|||
|
|
return True
|
|||
|
|
|
|||
|
|
|
|||
|
|
def drop_column_if_exists(table_name: str, column_name: str) -> bool:
|
|||
|
|
if not has_column(table_name, column_name):
|
|||
|
|
return False
|
|||
|
|
op.drop_column(table_name, column_name)
|
|||
|
|
return True
|