【问题标题】:SQLAlchemy Determine If Unique Constraint ExistsSQLAlchemy 确定是否存在唯一约束
【发布时间】:2016-02-26 00:27:21
【问题描述】:

我有一个想要运行验证的 SQLAlchemy 模型。验证的一部分是确保 UniqueConstraint 存在于(少数)列上。我知道这些列是什么。有没有用 SQLAlchemy 做到这一点的好方法?我使用的底层数据库是 MySQL。

【问题讨论】:

  • 在 sqlalchemy 人员回复您的同时,为什么不直接发送 show create table xyz 并看看这是一个孤立的问题还是一个更广泛的问题?

标签: python mysql python-2.7 sqlalchemy unique-constraint


【解决方案1】:

你可以使用SQLalchemy reflection 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

【讨论】:

  • 因此,如果尚未创建表,则会失败。如果我在创建表之前检查表的模型,有没有办法检查 UniqueConstraint 是否存在?
  • 是的@user2525229,有可能,答案已更新。
  • 在 Inspector 上使用 from_engine 自 1.4 版起已弃用。 docs.sqlalchemy.org/en/14/core/… 在 Engine 或 Connection 上使用 inspect() 函数来获取 Inspector。从 sqlalchemy 导入检查
猜你喜欢
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 2019-03-29
相关资源
最近更新 更多