SQLAlchemy与非唯一主键冲突

2024-10-03 21:36:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我正在使用FreeTDS驱动程序(版本8.0)连接到MSSQL数据库。当我从SQLA(在两台不同的机器上)运行查询时,我得到72行,然而,当我从visualstudio(在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)

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

^{pr2}$

它正在覆盖同一个ol\u orderno的所有以前的实例,我以前也注意到过,但是假设这是一个数据库错误,因为它发生在测试阶段,有没有任何方法可以在仍然使用具有声明性的基的orm时解决这个问题?在


Tags: 机器数据库dateascolumnintegerfilterol
2条回答

是和否:

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

是的,如果您想尝试以下操作:向表和主键添加一个自动递增的ID列。完成此操作后,每一行(在ORM:everyobject中)都是唯一可标识的,因此可以用于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的不同组合的所有行视为不同的对象。在

相关问题 更多 >