Bạn có thể sử dụng API phản ánh SQLalchemy .
Để có được các ràng buộc duy nhất, hãy phát hành get_unique_constraints .
Khóa chính là duy nhất, vì vậy bạn phải phát hành get_pk_constraint quá.
bảng được tạo bằng:
CREATE TABLE user (
id INTEGER NOT NULL,
name VARCHAR(255),
email VARCHAR(255),
login VARCHAR(255),
PRIMARY KEY (id),
UNIQUE (email),
UNIQUE (login)
)
ví dụ:
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")
đầu ra:
PK: {'name': None, 'constrained_columns': [u'login']}
UNIQUE: [{'column_names': [u'email'], 'name': None}, {'column_names': [u'login'], 'name': None}]
Bạn có thể xác minh các ràng buộc duy nhất bằng cách:
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)
đầu ra:
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
Cập nhật 01
Đoạn mã trên chỉ kiểm tra ràng buộc đối với các cột của bảng đã được tạo, nếu bạn muốn kiểm tra các cột trước khi tạo thì đơn giản hơn:
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)
đầu ra:
{'email': True, 'login': True, 'id': True, 'name': False}
Nếu bạn chỉ muốn kiểm tra một số cột, bạn chỉ có thể thực hiện:
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])))
đầu ra:
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