Python sqlalchemy中相同表的外键

Python sqlalchemy中相同表的外键,python,mysql,sqlalchemy,Python,Mysql,Sqlalchemy,我有一个MySQL表,在sqlalchemy中定义,具有以下结构: class User(Base): __tablename__ = 'user' __table_args__ = {'mysql_charset': 'utf8', 'mysql_engine': 'InnoDB'} id = Column(Integer, primary_key=True) handle = Column(String(250), nullable=False) ow

我有一个MySQL表,在sqlalchemy中定义,具有以下结构:

class User(Base):
    __tablename__ = 'user'
    __table_args__ = {'mysql_charset': 'utf8', 'mysql_engine': 'InnoDB'}
    id = Column(Integer, primary_key=True)
    handle = Column(String(250), nullable=False)
    owned = Column(Boolean(), default=False)
    owner_id = Column(Integer, ForeignKey("user.id"), nullable=True, default=null )
    current_price = Column(Integer, nullable=False, default=1)
    balance = Column(Integer, nullable=False, default=0)
我需要一个关系,以便owner_id可以为null,或者如果设置了,则必须引用同一表中的有效user.id

我对sqlalchemy关系的理解还不够透彻,无法做到这一点。本页顶部的特殊内容似乎表明这是可能的,但我无法理解

然后,我希望能够添加以下用户:

u1 = User(handle="bob")
u2 = User(handle="jim", owner=u1)
谢谢你的帮助

我应该补充一点,sqlalchemy在使用正确的外键约束创建表时没有问题,我可以手动将数据插入表中,遵守MySQL中的规则,这只是使用sqlalchemy模型失败了

编辑:已解决

由于某种原因,所有者id上的“default=null”导致了该问题。这里有一些有用的文档:下面是该页面的代码示例:

对于谷歌蜘蛛机器人,我在这个过程中遇到的错误有:

sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (1452, 'Cannot add or update a child row: a foreign key constraint fails (`twitfriends`.`tree`, CONSTRAINT `tree_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `tree` (`id`))') [SQL: u'INSERT INTO tree (parent_id, name) VALUES (%s, %s)'] [parameters: (<sqlalchemy.sql.elements.Null object at 0x7fe7e8c468d0>, 'rootnode')]
sqlalchemy.exc.IntegrityError:(\u mysql\u exceptions.IntegrityError)(1452,'无法添加或更新子行:外键约束失败(`twitfriends`.`tree`,约束`tree\u ibfk\u 1`外键(`parent\u id`)引用`tree`(`id`))[SQL:u'插入到树中(parent\u id,name)值(%s,%s)][参数:(,'rootnode')]


ArgumentError:Node.next和back reference Node.prev都是同一方向的,因为
用户只有一个外键
,我希望sqlalchemy能够自动计算出连接条件。您还可以添加
backref
,以便获得关系的另一面

class User(Base):
    ...
    owner = relationship('User', remote_side=['id'], backref='owned_users')


这两个都失败:sqlalchemy.exc.ArgumentError:User.owner和back reference User.owned_用户都是同一方向符号(“ONETOMANY”)。你的意思是将远程侧设置为多对一侧吗?这让我想到了这一点,但它似乎也不起作用:谢谢。。指向自引用页面的URL很有用,但有趣的是,这里的示例都不适合我。你知道为什么吗?我有SQLalchemy 1.0.11(从pip安装)和MySQL,使用InnoDBWell,我不知道为什么,但这里的示例是有效的:我将看看是否可以找出原因并发布更新。谢谢你的链接@Brendan!对于任何发现这一点的人来说,阻止上述代码工作的是owner\u id字段上的“default=null”!错误是:它生成了错误:sqlalchemy.exc.IntegrityError:(\u mysql\u exceptions.IntegrityError)(1452,'无法添加或更新子行:外键约束失败(
db
,constraint
tree\u ibfk\u 1
外键(
parent\u id
)引用
tree
id
))[SQL:u'INSERT-INTO-tree(parent_id,name)值(%s,%s)][参数:(,'rootnode')]
class User(Base):
    ...
    owner = relationship('User', remote_side=['id'], backref='owned_users')
u1 = User(handle="bob")
u2 = User(handle="jim", owner=u1)
print u2.owned_users[0] == u1
# True