[英]SQLAlchemy Determine If Unique Constraint Exists
I have a SQLAlchemy model on which I want to run validation.我有一个想要运行验证的 SQLAlchemy 模型。 Part of the validation is to ensure a UniqueConstraint exists on a (few) column(s).验证的一部分是确保在(少数)列上存在 UniqueConstraint。 I know what the columns are.我知道列是什么。 Is there a good way to do this with SQLAlchemy?有没有用 SQLAlchemy 做到这一点的好方法? The underlying database I am using is MySQL.我使用的底层数据库是 MySQL。
You could use SQLalchemy reflection API .您可以使用SQLalchemy 反射 API 。
In order to get the unique constraints, issue a get_unique_constraints .为了获得唯一约束,请发出get_unique_constraints 。
Primary keys are unique, so you must issue a get_pk_constraint too.主键是唯一的,因此您也必须发出get_pk_constraint 。
table created with:创建的表:
CREATE TABLE user (
id INTEGER NOT NULL,
name VARCHAR(255),
email VARCHAR(255),
login VARCHAR(255),
PRIMARY KEY (id),
UNIQUE (email),
UNIQUE (login)
)
example:例子:
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")
output:输出:
PK: {'name': None, 'constrained_columns': [u'login']}
UNIQUE: [{'column_names': [u'email'], 'name': None}, {'column_names': [u'login'], 'name': None}]
You can verify the unique constraints by:您可以通过以下方式验证唯一约束:
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)
output:输出:
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
The code above only check constraint for columns of an already created table, if you want to inspect the columns before the creation is more simple:上面的代码只检查已创建表的列的约束,如果要在创建前检查列更简单:
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)
output:输出:
{'email': True, 'login': True, 'id': True, 'name': False}
If you want to check only some columns, you could only do:如果只想检查某些列,则只能执行以下操作:
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])))
output:输出:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.