我正在尝试使用 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(),重新添加客户端等等,但如果这些都有效,则没有。 提前感谢您的帮助