Postgresql 炼金术手册ORM:&x27;RelationshipProperty';对象没有属性';家长';

Postgresql 炼金术手册ORM:&x27;RelationshipProperty';对象没有属性';家长';,postgresql,orm,sqlalchemy,flask,flask-sqlalchemy,Postgresql,Orm,Sqlalchemy,Flask,Flask Sqlalchemy,我是sqlAlchemy的新手,我正在尝试创建一个手动对象关系映射,映射到我的Flask应用程序中已经存在的postgresql数据库。我正在使用。但是,它没有说明如何使用backref创建模型之间的关系。到目前为止,这是我的models.py类,唯一给我带来麻烦的是backref。我试图在用户和F_联盟(许多幻想联盟对一个用户)之间建立一对多的关系。运行文件models.py时,出现以下错误: <User u'ivan'> <F_League u'First Fantasy

我是sqlAlchemy的新手,我正在尝试创建一个手动对象关系映射,映射到我的Flask应用程序中已经存在的postgresql数据库。我正在使用。但是,它没有说明如何使用backref创建模型之间的关系。到目前为止,这是我的models.py类,唯一给我带来麻烦的是backref。我试图在用户和F_联盟(许多幻想联盟对一个用户)之间建立一对多的关系。运行文件models.py时,出现以下错误:

<User u'ivan'>
<F_League  u'First Fantasy League'>
Traceback (most recent call last):
  File "app/models.py", line 86, in <module>
    print u1.leagues
  File "/home/ivan-manolov/Documents/fft/.env/local/lib/python2.7/site-packages/sqlalchemy/orm/properties.py", line 729, in __str__
    return str(self.parent.class_.__name__) + "." + self.key
AttributeError: 'RelationshipProperty' object has no attribute 'parent'

回溯(最近一次呼叫最后一次):
文件“app/models.py”,第86行,在
打印u1.0个联赛
文件“/home/ivan manolov/Documents/fft/.env/local/lib/python2.7/site packages/sqlalchemy/orm/properties.py”,第729行,在__
返回str(self.parent.class.\uuuuu name.\uuuuu)+“+”self.key
AttributeError:“RelationshipProperty”对象没有属性“parent”
这是我的models.py文件:

from sqlalchemy import create_engine, MetaData
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, backref, mapper
from sqlalchemy import *
from sqlalchemy.orm import scoped_session, sessionmaker

engine = create_engine('postgresql://nfldb:nfldb@localhost/nfldb', convert_unicode=True, echo=False)
metadata=MetaData()
db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))

def init_db():
    metadata.create_all(bind=engine)

class User(object):
        query=db_session.query_property()
        leagues=relationship("F_League",backref="fowner",lazy="dynamic") 
    def __init__(self, user_id=None, user_name=None, first_name=None, last_name=None, email=None, password=None, last_sign_out=None):
        self.user_id= user_id
        self.user_name=user_name
        self.first_name= first_name
        self.last_name= last_name
        self.email= email
        self.password=password
        self.last_sign_out= last_sign_out


    #def set_password(self, password):
         #   self.pwdhash = generate_password_hash(password)

        def check_password(self, password):
            return self.password==password

        def is_authenticated(self):
            return True

        def is_active(self):
            return True

        def is_anonymous(self):
            return False

        def get_id(self):
            return unicode(self.user_id)

    def __repr__(self):
            return '<User %r>' % (self.user_name)

users=Table('users',metadata,
    Column('user_id', Integer, primary_key=True),
    Column('user_name', String, unique=True, nullable=False),
    Column('last_name', String, nullable=False),
    Column('email', String,unique=True, nullable=False),
    Column('password', String),
    Column('last_sign_out', DateTime),

    )
mapper(User, users)

class F_League(object):
    query=db_session.query_property()  

    def __init__(self, league_id=None, user_id=None, league_name=None):
        self.league_id=league_id
        self.user_id=user_id
        self.league_name=league_name

    def __repr__(self):                                                    
        return '<F_League  %r>' % (self.league_name) 

fleagues=Table("f_league",metadata,
       Column( 'league_id', Integer, primary_key=True),
       Column('user_id', Integer, ForeignKey('users.user_id')),
       Column('league_name',String, unique=True)
       )
mapper(F_League, fleagues)



if __name__=="__main__":
    result=User.query.filter_by(user_name="ivan").first()
        print result
        league=db_session.query(F_League).join(User).filter_by(user_id=1).first()
        print league
        u1=User()
        f1= F_League()
        print u1.leagues

       # many1= db_session.query(User.leagues).join(User).filter_by(user_id=1).first()
        #print many1
从sqlalchemy导入创建引擎,元数据
从sqlalchemy.ext.declarative导入声明性基础
从sqlalchemy.orm导入关系、backref、mapper
从sqlalchemy导入*
从sqlalchemy.orm导入作用域的_会话,sessionmaker
引擎=创建引擎('postgresql://nfldb:nfldb@localhost/nfldb',convert_unicode=True,echo=False)
元数据=元数据()
db_session=scoped_session(sessionmaker(autocommit=False,autoflush=False,bind=engine))
def init_db():
metadata.create_all(绑定=引擎)
类用户(对象):
query=db\u会话。query\u属性()
联盟=关系(“F_联盟”,backref=“fowner”,lazy=“dynamic”)
def uuu init uuuuu(self,user_id=None,user_name=None,first_name=None,last_name=None,email=None,password=None,last_sign_=None):
self.user\u id=user\u id
self.user\u name=用户名
self.first\u name=first\u name
self.last\u name=last\u name
self.email=电子邮件
self.password=密码
self.last\u sign\u out=last\u sign\u out
#def设置_密码(自我、密码):
#self.pwdhash=生成密码散列(密码)
def检查_密码(自我、密码):
返回self.password==密码
def已通过身份验证(自身):
返回真值
def处于活动状态(自):
返回真值
def是匿名的(自我):
返回错误
def get_id(自身):
返回unicode(self.user\u id)
定义报告(自我):
返回“”%(自用户名称)
users=表('users',元数据,
列('user\u id',Integer,primary\u key=True),
列('user_name',String,unique=True,nullable=False),
列('last_name',String,nullable=False),
列('email',字符串,unique=True,nullable=False),
列('密码',字符串),
列(“最后一次注销”,日期时间),
)
映射器(用户,用户)
F类联赛(目标):
query=db\u会话。query\u属性()
定义初始化(self,league\u id=None,user\u id=None,league\u name=None):
self.league\u id=league\u id
self.user\u id=user\u id
self.league\u name=联盟名称
定义报告(自我):
返回“”%(自我联盟名称)
跳蚤=表格(“f_联盟”,元数据,
列('league_id',整数,主键=True),
列('user\u id',Integer,ForeignKey('users.user\u id')),
列('league_name',String,unique=True)
)
制图员(F_League,Flegues)
如果名称=“\uuuuu main\uuuuuuuu”:
结果=User.query.filter\u by(User\u name=“ivan”).first()
打印结果
league=db\u session.query(F\u league).join(User).filter\u by(User\u id=1).first()
印刷联盟
u1=用户()
f1=F_联赛()
打印u1.0个联赛
#many1=db_session.query(User.leagues).join(User).filter_by(User_id=1).first()
#印刷品数量1

提前感谢您的帮助

当您执行以下操作时,您错误地混合了和映射的使用:

class User(object):
    query=db_session.query_property()

    # this is wrong
    leagues=relationship("F_League",backref="fowner",lazy="dynamic") 

    # ...

users=Table('users',metadata,
    # ...
)

mapper(User, users)
这是你的两个选择

  • 声明性:

    Base = declarative_base()
    
    class User(Base):
        __tablename__ = 'users'
    
        user_id = Column(Integer, priamry_key=True)
        user_name = Column(String)
    
        # ...
    
        leagues=relationship("F_League",backref="fowner",lazy="dynamic") 
    
  • 经典:

    class User(object):
        query=db_session.query_property()
    
        # ...
    
    users=Table('users',metadata,
        # ...
    )
    
    mapper(User, users, properties={
        "leagues": relationship(F_League, backref="fowner", lazy="dynamic") 
    })
    

  • 当您执行以下操作时,您错误地混合了和映射的使用:

    class User(object):
        query=db_session.query_property()
    
        # this is wrong
        leagues=relationship("F_League",backref="fowner",lazy="dynamic") 
    
        # ...
    
    users=Table('users',metadata,
        # ...
    )
    
    mapper(User, users)
    
    这是你的两个选择

  • 声明性:

    Base = declarative_base()
    
    class User(Base):
        __tablename__ = 'users'
    
        user_id = Column(Integer, priamry_key=True)
        user_name = Column(String)
    
        # ...
    
        leagues=relationship("F_League",backref="fowner",lazy="dynamic") 
    
  • 经典:

    class User(object):
        query=db_session.query_property()
    
        # ...
    
    users=Table('users',metadata,
        # ...
    )
    
    mapper(User, users, properties={
        "leagues": relationship(F_League, backref="fowner", lazy="dynamic") 
    })
    

  • 我得到了同样的错误,但是使用了带有“secondary”和“secondaryjoin”的经典方法。你有关于这两个的例子吗?我得到了同样的错误,但是使用了带有'secondary'和'secondaryjoin'的经典方法。你有这两个例子吗?