我会说,这不是我的数据库,我没有设计或创建它,我只是简单地连接到它来编写一个应用程序,不要评判我使用的不是唯一的索引!
我正在使用FreeTDS驱动程序(Version8.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和声明基的同时,有什么方法来解决这个问题吗?
发布于 2015-05-11 10:57:35
如果您的数据库中有任何列的组合是唯一的,您可以在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组合的行视为不同的对象。
发布于 2015-05-11 08:48:51
是和否:
不,如果您想保持这个数据库模式--如果对象不能被ID加密,那么无法区分它们--这不是主键,至少不是完整的。-当您不知道将更新哪个行时,您真的不想更新行。
是的,如果您想尝试以下操作:将一个自动递增ID列添加到表和主键中。一旦您这样做了,每一行(在ORM:每个对象中)都是唯一可识别的,因此可以在SQLalchemy中使用。
https://stackoverflow.com/questions/30161942
复制相似问题