SQLAlchemy 不能很好地处理非唯一主键
SQLAlchemy not playing nicely with non unique primary keys
首先我要说这不是我的数据库,我没有设计或创建它,我只是连接它写一个应用程序,不要用非唯一索引来判断我!
我正在使用 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 与声明性基础一起使用?
是与否:
否,如果您想保留此数据库模式 - SQLalchemy 无法区分对象,如果它们不能 IDentified - 这不是主键,至少不是一个完整的。 - 当您不知道 哪个 行将被更新时,您真的不想更新行。
是的,如果您想尝试以下操作:将自动递增的 ID 列添加到 table 和主键。完成此操作后,每一行(在 ORM 中:每个对象)都是唯一可识别的,因此可用于 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
不同组合的所有行视为不同的对象。
首先我要说这不是我的数据库,我没有设计或创建它,我只是连接它写一个应用程序,不要用非唯一索引来判断我!
我正在使用 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 与声明性基础一起使用?
是与否:
否,如果您想保留此数据库模式 - SQLalchemy 无法区分对象,如果它们不能 IDentified - 这不是主键,至少不是一个完整的。 - 当您不知道 哪个 行将被更新时,您真的不想更新行。
是的,如果您想尝试以下操作:将自动递增的 ID 列添加到 table 和主键。完成此操作后,每一行(在 ORM 中:每个对象)都是唯一可识别的,因此可用于 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
不同组合的所有行视为不同的对象。