我会先说这不是我的数据库,我没有设计或创建它,我只是连接到它来写一个应用程序,不要评判我对非唯一索引的使用!在
我正在使用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时解决这个问题?在
是和否:
不,如果你想保留这个数据库模式-SQLalchemy无法区分对象,如果它们不能ID实体化-这不是主键,至少不是完整的主键。-当您不知道哪一行将被更新时,您真的不想更新行。在
是的,如果您想尝试以下操作:向表和主键添加一个自动递增的ID列。完成此操作后,每一行(在ORM:everyobject中)都是唯一可标识的,因此可以用于SQLalchemy。在
如果数据库中有任何列的组合是唯一的, 您可以在SQLAlchemy中将它们用作复合主键。 为此,只需通过
primary_key=True
将这些列添加到复合主键中。在例如,这种SQLAlchemy将把
order_no, linestatus
的不同组合的所有行视为不同的对象。在相关问题 更多 >
编程相关推荐