SQLalchemy 不承诺一对一关系

问题描述 投票:0回答:0

我正在尝试使用 Flask 和 SQLAlchemy 设置一个数据库,其 view_only 一对一关系如下:

import os
from flask import Flask
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, Boolean, Text
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.ext.declarative import declarative_base

basedir = os.path.abspath(os.path.dirname(__file__))

engine = create_engine('sqlite:///' + os.path.join(basedir, 'database.db'))
Base = declarative_base()

app = Flask(__name__)

class Client(Base):
    __tablename__ = "client"
    id = Column(Integer, primary_key=True)
    nom = Column(String(100), nullable=False)
    is_active = Column(Boolean, default=True)
    contact_principal = relationship("Contact", uselist=False, viewonly=True, lazy='subquery')
    contacts = relationship("Contact", backref="client", lazy='subquery')

class Contact(Base):
    __tablename__ = "contact"
    id = Column(Integer, primary_key=True)
    client_id = Column(Integer, ForeignKey('client.id'))
    nom = Column(String(100), nullable=False)
    
Base.metadata.create_all(engine)
Session_db = sessionmaker(bind=engine)
    
session_db = Session_db()
contact = Contact(nom="contact1")
client = Client(nom="client1")
contact2 = Contact(nom="contact2")
session_db.add_all([contact, client, contact2])
session_db.commit()
client.contact_principal = contact
session_db.commit()
session_db.close()

session_db = Session_db()
contact = session_db.get(Contact, 2)
client = session_db.get(Client, 1)
print(client.contact_principal)
client.contact_principal = contact
print(client.contact_principal)
session_db.commit()
session_db.close()

session_db = Session_db()
client = session_db.get(Client, 1)
print(client.contact_principal)
session_db.commit()
session_db.close()

所以似乎对客户端对象所做的任何修改都没有正确提交,这是这段代码的输出:

None
<__main__.Contact object at 0x000001C457AA1D50>
None

我注意到在创建客户端时设置 client.contact_principal 时,这个 contact_principal 被正确保存。问题是当我想改变那个值时,提交没有正确完成,但我不知道为什么。

到目前为止,我尝试过使用 merge(),重新添加客户端等等,但如果这些都有效,则没有。 提前感谢您的帮助

python flask sqlalchemy backend commit
© www.soinside.com 2019 - 2024. All rights reserved.