SQLAlchemy ORM检查列是否为foreign_key

时间:2016-01-20 07:34:28

标签: python sqlalchemy

您好我想知道是否有人知道找出列是否具有foreignKey关系的最有效方法。

class StudentIntendCourse(DeclarativeBase):
    __tablename__ = 'studentIntendCourse'
    id = Column(Integer, primary_key=True)
    studentID = Column('studentID',Integer,ForeignKey('student.id'))
    courseID = Column('courseID',Integer,ForeignKey('course.id'))
    course = relationship("Course",backref="studentIntendedCourses")

我想知道是否is_foreign_key(StudentIntendCourse.studentID)?

3 个答案:

答案 0 :(得分:3)

与该单个ForeignKey对象相关联的Column个对象位于该列的foreign_keys集合中。

foreign_keys_set = StudentIntendCourse.__table__.c.studentID.foreign_keys

您可以检查此设置是否为非空

答案 1 :(得分:0)

我有类似的问题。实际上,我没有表对象,但是有表名和类似的列名。这是我的解决方案:

from sqlalchemy.schema import MetaData
from sqlalchemy import create_engine

engine = create_engine( URL )
meta = MetaData()
meta.reflect(bind=engine)

def is_foreign_key(table_name, col_name):
    return col_name in [e.target_fullname for e in meta.tables[table_name].foreign_keys]

注意:

meta.tables[table_name].foreign_keys == Table.__table__.foreign_keys

答案 2 :(得分:0)

所有列均具有属性“ foreign_keys”,该属性是一个集合,但对于不是ForeignKey的所有列均为空,因此简单的测试可以为您提供正确的答案。在您的示例中:

def is_foreign_key(column):
    return True if column.foreign_keys else False

print(is_foreign_key(StudentIntendCourse.studentID))

如果要获取所有ForeignKey的列表:

from sqlalchemy.inspection import inspect

foreign_keys_list = [c.key for c in inspect(StudentIntendCourse) if getattr(StudentIntendCourse, c.key).foreign_keys]

我强烈建议使用inspection,而不是直接访问SQLAlchemy的嵌套结构。