SQLAlchemy不能很好地使用非唯一主键

时间:2015-05-11 07:31:50

标签: python sqlalchemy

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

我使用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 ?

2 个答案:

答案 0 :(得分:1)

如果数据库中的列的任何组合都是唯一的, 您可以在SQLAlchemy中将它们用作复合主键。 为此,只需通过NSInteger section = [self numberOfSectionsInCollectionView:collectionView] - 1; NSInteger item = [self collectionView:collectionView numberOfItemsInSection:section] - 1; NSIndexPath *lastIndexPath = [NSIndexPath indexPathForItem:item inSection:section]; [collectionView scrollToItemAtIndexPath:lastIndexPath atScrollPosition:UICollectionViewScrollPositionBottom animated:YES]; 将这些列添加到复合主键。

primary_key=True

这个SQLAlchemy会例如将具有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) 的不同组合的所有行视为不同的对象。

答案 1 :(得分:0)

是和否:

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

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