首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQLAlchemy没有很好地使用非唯一的主键

SQLAlchemy没有很好地使用非唯一的主键
EN

Stack Overflow用户
提问于 2015-05-11 07:31:49
回答 2查看 1.7K关注 0票数 1

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

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

代码语言:javascript
运行
复制
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并不是唯一的,所以当生成以下内容时.

代码语言:javascript
运行
复制
sqlalchemy generates SELECT orderline.ol_orderno AS orderline_ol_orderno

它覆盖了相同ol_orderno的所有以前的实例,我曾经注意到过这一点,但假设它是在测试阶段发生的数据库错误,在仍然使用orm和声明基的同时,有什么方法来解决这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-11 10:57:35

如果您的数据库中有任何列的组合是唯一的,您可以在SQLAlchemy中使用这些列作为复合主键。要做到这一点,只需通过primary_key=True将这些列添加到复合主键。

代码语言:javascript
运行
复制
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组合的行视为不同的对象。

票数 2
EN

Stack Overflow用户

发布于 2015-05-11 08:48:51

是和否:

不,如果您想保持这个数据库模式--如果对象不能被ID加密,那么无法区分它们--这不是主键,至少不是完整的。-当您不知道将更新哪个行时,您真的不想更新行。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30161942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档