Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

SQLAlchemy xác định nếu tồn tại ràng buộc duy nhất

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. chọn mọi hàng khác trong MySQL mà không phụ thuộc vào bất kỳ ID nào?

  2. MySQL Replication &Trigger

  3. Chọn trong MySQL nơi tất cả các hàng đáp ứng một điều kiện

  4. Đặt lại tự động tăng ID? phpmyadmin

  5. MySQL sao chép nhiều giá trị hàng có cùng ID vào các cột mới?