sqlalchemy

时间:2016-01-15 01:22:24

标签: 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)
    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关系的东西,以便能够做到这一点。本页顶部http://docs.sqlalchemy.org/en/latest/orm/relationship_persistence.html的特殊内容似乎表明它是可能的,但我无法弄明白。

我希望能够像以下那样添加用户:

u1 = User(handle="bob")
u2 = User(handle="jim", owner=u1)

感谢您的帮助!

我应该补充一点,sqlalchemy使用正确的FOREIGN KEY约束执行CREATE TABLE没有问题,我可以手动将数据插入到符合规则的表中,因为我想要它们在MySQL中,它只使用失败的sqlalchemy模型

编辑:已解决

owner_id上的'default = null'由于某种原因导致了问题。有用的文档在这里:http://docs.sqlalchemy.org/en/rel_1_0/orm/self_referential.html和该页面的代码示例:http://docs.sqlalchemy.org/en/rel_1_0/orm/examples.html#examples-adjacencylist

对于Google蜘蛛机器人,我在此过程中遇到的错误是:

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')]

ArgumentError: Node.next and back-reference Node.prev are both of the same direction <symbol 'ONETOMANY>.  Did you mean to set remote_side on the many-to-one side ?

1 个答案:

答案 0 :(得分:1)

由于User只有一个外键,我希望sqlalchemy自动计算出连接条件。您还可以添加backref,以便获得关系的另一面。

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

Docs

实施例

u1 = User(handle="bob")
u2 = User(handle="jim", owner=u1)
print u2.owned_users[0] == u1
# True