SQLAlchemy确定是否存在唯一约束

发布于 2021-01-29 15:05:15

我有一个要运行验证的SQLAlchemy模型。验证的一部分是确保(少数)列上存在UniqueConstraint。我知道列是什么。使用SQLAlchemy可以做到这一点吗?我正在使用的基础数据库是MySQL。

关注者
0
被浏览
108
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以使用SQLalchemy反射API

    为了获得唯一约束,请发出get_unique_constraints

    主键是唯一的,因此您也必须发出get_pk_constraint

    创建的表:

    CREATE TABLE user (
        id INTEGER NOT NULL, 
        name VARCHAR(255), 
        email VARCHAR(255), 
        login VARCHAR(255), 
        PRIMARY KEY (id), 
        UNIQUE (email), 
        UNIQUE (login)
    )
    

    例:

    from sqlalchemy import create_engine
    from sqlalchemy.engine.reflection import Inspector
    
    # engine = create_engine(...)
    
    insp = Inspector.from_engine(engine)
    
    print "PK: %r" % insp.get_pk_constraint("user")
    print "UNIQUE: %r" % insp.get_unique_constraints("user")
    

    输出:

    PK: {'name': None, 'constrained_columns': [u'login']}
    UNIQUE: [{'column_names': [u'email'], 'name': None}, {'column_names': [u'login'], 'name': None}]
    

    您可以通过以下方式验证唯一约束:

    pk = insp.get_pk_constraint("user")['constrained_columns']
    unique = map(lambda x: x['column_names'], insp.get_unique_constraints("user"))
    
    for column in ['name', 'id', 'email', 'login']:
        print "Column %r has an unique constraint: %s" %(column, [column] in [pk]+unique)
    

    输出:

    Column 'name' has an unique constraint: False
    Column 'id' has an unique constraint: True
    Column 'email' has an unique constraint: True
    Column 'login' has an unique constraint: True
    

    更新01

    如果您想在创建表之前更简单地检查列,则上面的代码仅检查已创建表的列约束:

    from sqlalchemy import create_engine, Column, types
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import sessionmaker, scoped_session
    
    Base = declarative_base()
    
    class User(Base):
        __tablename__ = "user"
        id = Column(types.Integer, primary_key=True)
        name = Column(types.String(255))
        email = Column(types.String(255), unique=True)
        login = Column(types.String(255), unique=True)
    
    # do not create any table
    #engine = create_engine('sqlite:///:memory:', echo=True)
    #session = scoped_session(sessionmaker(bind=engine))
    #Base.metadata.create_all(engine)
    
    # check if column is (any) a primary_key or has unique constraint
    # Note1: You can use User.__table__.c too, it is a alias to columns
    # Note2: If you don't want to use __table__, you could use the reflection API like:
    #        >>> from sqlalchemy.inspection import inspect
    #        >>> columns = inspect(User).columns
    result = dict([(c.name, any([c.primary_key, c.unique])) for c in User.__table__.columns])
    
    print(result)
    

    输出:

    {'email': True, 'login': True, 'id': True, 'name': False}
    

    如果只想检查一些列,则只能执行以下操作:

    for column_name in ['name', 'id', 'email', 'login']:
        c = User.__table__.columns.get(column_name)
        print("Column %r has an unique constraint: %s" %(column_name, any([c.primary_key, c.unique])))
    

    输出:

    Column 'name' has an unique constraint: False
    Column 'id' has an unique constraint: True
    Column 'email' has an unique constraint: True
    Column 'login' has an unique constraint: True
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看