moz*_*boz 6 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)
Run Code Online (Sandbox Code Playgroud)
我想要一个关系,以便 owner_id 可以为空,或者如果它被设置,它必须引用同一个表中的有效 user.id。
我不太了解 sqlalchemy 关系的东西,无法做到这一点。此页面顶部的特殊内容http://docs.sqlalchemy.org/en/latest/orm/relationship_persistence.html似乎表明这是可能的,但我无法弄清楚。
我希望然后能够添加用户,如:
u1 = User(handle="bob")
u2 = User(handle="jim", owner=u1)
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
我应该补充一点,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
对于谷歌蜘蛛机器人,我在这个过程中遇到的错误是:
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')]
Run Code Online (Sandbox Code Playgroud)
和
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 ?
Run Code Online (Sandbox Code Playgroud)
由于 仅有一个外键User,我希望 sqlalchemy 能够自动找出连接条件。您还可以添加一个backref,以便了解关系的另一面。
class User(Base):
...
owner = relationship('User', remote_side=['id'], backref='owned_users')
Run Code Online (Sandbox Code Playgroud)
前任。
u1 = User(handle="bob")
u2 = User(handle="jim", owner=u1)
print u2.owned_users[0] == u1
# True
Run Code Online (Sandbox Code Playgroud)