SQLAlchemy 不能很好地处理非唯一主键

SQLAlchemy not playing nicely with non unique primary keys

首先我要说这不是我的数据库,我没有设计或创建它,我只是连接它写一个应用程序,不要用非唯一索引来判断我!

我正在使用 FreeTDS 驱动程序(8.0 版)连接到 MSSQL 数据库。当我从 SQLA(在两台不同的机器上)运行 查询时,我得到 72 行,但是,当我从 visual studio(在 windows 机器上)查询时,我得到正确的结果 165行,这是我的代码。

class OrderLine(BaseRO):
    __tablename__ = 'orderline'
    ol_orderno = Column(Integer, ForeignKey('orderhead.oh_orderno'), 
        primary_key=True)
    ol_linestatus = Column(Integer)
    ol_reqdate = Column(Date)
    ol_statusdate  = Column(Date)
    ol_stocktype = Column(String)

statuss = [40, 60]
orders = DBSessionRO.query(OrderLine).\
    filter(OrderLine.ol_reqdate == date_today).\
    filter(OrderLine.ol_stocktype == 5).\
    filter(OrderLine.ol_linestatus.in_(statuss)).all()

len(orders)
72

# This generates this sql..
SELECT orderline.ol_orderno AS orderline_ol_orderno, orderline.ol_linestatus AS ol_linestatus, orderline.ol_reqdate AS orderline_ol_reqdate, orderline.ol_statusdate AS orderline_ol_statusdate, orderline.ol_stocktype  AS orderline_ol_stocktype 
FROM orderline
WHERE orderline.ol_reqdate = 2015-05-11 AND 
orderline.ol_stocktype = 5 AND orderline.ol_linestatus IN (40, 60)

现在我很确定问题出在哪里,ol_orderno 列不是唯一的,所以当生成以下内容时...

sqlalchemy generates SELECT orderline.ol_orderno AS orderline_ol_orderno

它正在覆盖相同 ol_orderno 的所有先前实例,我以前注意到过一次,但假设这是一个数据库错误,因为它发生在测试阶段,有什么方法可以解决这个问题,同时仍然将 orm 与声明性基础一起使用?

是与否:

否,如果您想保留此数据库模式 - SQLalchemy 无法区分对象,如果它们不能 IDentified - 这不是主键,至少不是一个完整的。 - 当您不知道 哪个 行将被更新时,您真的不想更新行。

是的,如果您想尝试以下操作:将自动递增的 ID 列添加到 table 和主键。完成此操作后,每一行(在 ORM 中:每个对象)都是唯一可识别的,因此可用于 SQLalchemy。

如果您的数据库中存在任何唯一的列组合, 您可以将它们用作 SQLAlchemy 中的复合主键。 为此,只需通过 primary_key=True.

将这些列添加到复合主键
class OrderLine(BaseRO):
    __tablename__ = 'orderline'
    ol_orderno = Column(Integer, ForeignKey('orderhead.oh_orderno'), 
        primary_key=True)
    ol_linestatus = Column(Integer, primary_key=True)
    ol_reqdate = Column(Date)
    ol_statusdate  = Column(Date)
    ol_stocktype = Column(String)

这个 SQLAlchemy 将例如将具有 order_no, linestatus 不同组合的所有行视为不同的对象。