小编ton*_*nio的帖子

SQLAlchemy内省具有继承的列类型

考虑此代码(并使用SQLAlchemy 0.7.7):

class Document(Base):
    __tablename__ = 'document'
    __table_args__ = {
        'schema': 'app'
    }

    id = Column(types.Integer, primary_key=True)
    nom = Column(types.Unicode(256), nullable=False)
    date = Column(types.Date())

    type_document = Column(types.Enum('arrete', 'photographie',
        name='TYPES_DOCUMENT_ENUM'))
    __mapper_args__ = {'polymorphic_on': type_document}

class Arrete(Document):
    __tablename__ = 'arrete'
    __table_args__ = {
        'schema': 'app'
    }
    __mapper_args__ = {'polymorphic_identity': 'arrete'}

    id = Column(types.Integer, ForeignKey('app.document.id'), primary_key=True)
    numero_arrete = Column(types.Integer)
    date_arrete = Column(types.Date())
Run Code Online (Sandbox Code Playgroud)

我可以很容易地对Arrete类中定义的列的列类型进行内省:

Arrete.__table__.c['date_arrete'].type
Run Code Online (Sandbox Code Playgroud)

但是,如果我想通过Arrete类访问类中定义的列,则这不起作用Document.(如果我尝试访问,则为KeyError c['date']).

有没有办法获得列类型,无论列是在最终类中还是在其父类中定义的?

python inheritance sqlalchemy introspection

13
推荐指数
2
解决办法
9887
查看次数

删除关系的行为

这不是一个问题,我只是想了解.考虑以下代码:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import *
from sqlalchemy.orm import sessionmaker, relationship
Base = declarative_base()

class AB(Base):
    __tablename__= 'ab'
    id_a = Column(Integer, ForeignKey('a.id', ondelete='CASCADE'), primary_key=True)
    id_b = Column(Integer, ForeignKey('b.id', ondelete='CASCADE'), primary_key=True)
    rel = Column(Unicode)

class A(Base):
    __tablename__ = 'a'
    id = Column(Integer, primary_key=True)

class B(Base):
    __tablename__ = 'b'
    id = Column(Integer, primary_key=True)
    #1: doesn’t work try to set id_b to null
    rel_a = relationship('AB')
    # Works, but cascade='all' seems uneeded to me
    rel_a = relationship('AB', cascade='all')
    # Works …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy

7
推荐指数
1
解决办法
4907
查看次数

Association_proxy与0-n关系

尝试使用association_proxy时遇到错误.

我得到映射的类A,与B的0-n关系.B与C的0-n关系.association_proxy是从C访问A.

class C(base):
    a = association_proxy('b', 'a')
Run Code Online (Sandbox Code Playgroud)

如果它确实与B有关系,它的工作没有问题.但如果这种关系是null,那么尝试访问myCinstance.a会抛出:AttributeError 'NoneType' object has no attribute 'a'.我猜它适用于1-n关系,但有没有一种方法myCinstance.a返回None而不是错误?(我看到了创建者选项,但看起来只是为了设置,而不是获取).

提前致谢.

我正在使用SqlAlchemy 0.7.5

编辑:我想出了一个简单的例子来描述问题https://gist.github.com/2225046

python sqlalchemy

4
推荐指数
1
解决办法
556
查看次数

标签 统计

python ×3

sqlalchemy ×3

inheritance ×1

introspection ×1