我有一个要运行验证的SQLAlchemy模型。验证的一部分是确保(少数)列上存在UniqueConstraint。我知道列是什么。使用SQLAlchemy可以做到这一点吗?我正在使用的基础数据库是MySQL。
您可以使用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
如果您想在创建表之前更简单地检查列,则上面的代码仅检查已创建表的列约束:
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])))