簡體   English   中英

SqlAlchemy 通過外鍵更新表

[英]SqlAlchemy update table through foreign key

我的 sqlalchemy 中有 2 個表

書桌

class Book(Base):
    __tablename__ = 'books'

    rowid = Column(Integer(), primary_key = True)
    name = Column(String(50), index = True)
    author = Column(String(50))
    year = Column(Integer())
    book_type = Column(Integer(), nullable = False)
    isloaned = Column(Boolean(), nullable = False, default = False)

貸款表

class Loans(db.Base):
    __tablename__ = 'loans'

    loan_id = Column(Integer(), primary_key = True)
    custID = Column(Integer(), ForeignKey(customers.Customer.rowid))
    bookID = Column(Integer(), ForeignKey(books.Book.rowid))
    loan_date = Column(DateTime())
    return_date = Column(DateTime())
    islate = Column(Boolean(), default = True, nullable = False)

    customername = relationship("Customer", foreign_keys = custID)
    bookname = relationship("Book", foreign_keys = bookID)

貸款表通過外鍵連接到書表。

現在我有一些代碼,所以當我把書還給圖書館時,它會更新借還日期。

我想用它更新書中的 isloaned 列,我用這段代碼嘗試了一些東西:

def returnloan(loanid, date):
    with mydb.session as session:
        session.query(Loans).filter(Loans.loan_id == loanid).update({"return_date": date})
        session.query(Loans).filter(Loans.loan_id == loanid).update({"bookname.isloaned": False})
        session.commit()

但我得到一個錯誤

sqlalchemy.exc.InvalidRequestError: Invalid expression type: 'bookname.isloaned'

歸還日期已更新,但我無法通過外鍵找到這本書。

有什么建議么?

你只需要更新Book 理想情況下,您還需要Loans表上的反向引用,以便您可以從Book訪問它:

bookname = relationship("Book", foreign_keys=bookID, backref="loans")

使用 SQLAlchemy 1.4 語法,您將更新如下內容:

stmt = update(Loans).where(Loans.loan_id == loan_id).values(return_date=date)
session.execute(stmt)

stmt = update(Book).where(Book.loans.has(Loans.load_id == loan_id)).values(isloaned=False)
session.execute(stmt)

我認為使用您當前的語法,這可能有效:

session.query(Book).filter(Book.loans.has(Loans.load_id == loan_id)).update({"isloaned": False})

或者,這將是僅使用 ORM 的超級簡單方法:

loan = session.execute(select(Loans).where(Loans.loan_id == loan_id)).scalar()
loan.return_date = date
loan.book.isloaned = False

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM