SQLAlchemy-错误TVP的行必须是Sequence对象

时间:2019-02-25 08:53:34

标签: python sqlalchemy

C#开发人员在玩python,使用SQLAlchemy将行插入SQL数据库时遇到问题。

更新代码是这个。

def updateDatabase(self, testSummary):
        params = quote_plus(
            "DRIVER={ODBC Driver 17 for SQL Server};SERVER=GBBED01DB01\SQLHOTEL2;DATABASE=TesterDb;trusted_connection=yes")
        engine = create_engine(
            "mssql+pyodbc:///?odbc_connect={}".format(params))

        Session = sessionmaker(bind=engine)

        session = Session()
        session.add(testSummary)

        for testStepResult in testSummary.testStepResults:   <------- Exception
            session.add(testStepResult)
            for ictResult in testStepResult.ictResults:
                session.add(ictResult)

        try:
            session.commit()
        except Exception as e:
            print("SQL failed to save\n" + e)

我已经标记了异常发生的地方,这就是异常。

  

(pyodbc.ProgrammingError)(“ TVP的行必须是Sequence对象。”,   'HY000')[SQL:'将INERT插入[IctResults]([didTestPass],[testName],   分量,[lowerLimit],[upperLimit],已测量,[rawMeasured],   [isOverRange],[isUnderRange],[isPosativeInfinity],   [isNegativeInfinity],[testStepResultId])已插入OUTPUT。idVALUES   (?,?,?,?,?,?,?,?,?,?,?,?,?)'] [参数:(1,'Motor   电阻检查'',``电机'',(2224.0,),(2409.0,),(2292.9794921875,),   (2292.9794921875,),0,0,0,0,129649)]

表结构如下

class TestSummary(Base):
__tablename__ = 'TestSummaries'
id = Column(Integer, primary_key=True)
didTestPass = Column(Boolean)
barcode = Column(String)
testDateTime = Column(DateTime)
testerId = Column(Integer)
fixtureId = Column(Integer)
boardId = Column(Integer)
testMode = Column(Integer)
userMode = Column(Integer)
productVariantId = Column(Integer, ForeignKey('ProductVariants.id'))
cycleTimeSeconds = Column(Integer)
testStepResults = relationship("TestStepResult", backref="TestSummary", lazy='dynamic')


class TestStepResult(Base):
__tablename__ = 'TestStepResults'
id = Column(Integer, primary_key=True)
testSummaryId = Column(Integer, ForeignKey('TestSummaries.id'))
testSummary = relationship(TestSummary)
testName = Column(String)
stepTime = Column(Float, default=0)
stepResult = Column(Boolean)
ictResults = relationship("IctResult", backref="TestStepResult", lazy='dynamic')


class IctResult(Base):
__tablename__ = 'IctResults'
id = Column(Integer, primary_key=True)
didTestPass = Column(Boolean)
testName = Column(String)
component = Column(String)
lowerLimit = Column(Float)
upperLimit = Column(Float)
measured = Column(Float)
rawMeasured = Column(Float)
isOverRange = Column(Boolean, default=False)
isUnderRange = Column(Boolean, default=False)
isPosativeInfinity = Column(Boolean, default=False)
isNegativeInfinity = Column(Boolean, default=False)
testStepResultId = Column(Integer, ForeignKey('TestStepResults.id'))
testStepResult = relationship(TestStepResult)

也许我的关系设置错误,但是应该是这样。 一个带有多个“ TestStepResult”的“测试摘要”和一个带有多个“ IctResult”的“ TestStepResult”。

2 个答案:

答案 0 :(得分:1)

尽管此问题已在您的特定情况下得到解答,但它是此错误消息的 #1 google 结果,因此我想我会添加我的经验。

我在尝试解析 JSON api 响应并将其插入数据库表时遇到此错误。

有问题的字段最初设置为返回值列表,但后来更改为仅返回 1。但是,它仍然返回长度为 1 的列表。

尝试插入列表项抛出错误;将其转换为字符串即可解决。

答案 1 :(得分:0)

正如@ilja指出的那样,您传递给查询的某些参数是元组,而不是标量。据我所知,SQLAlchemy不支持开箱即用的数组数据库类型。

我遇到了同样的问题,我的问题是因为由于一些复制粘贴而在作业行的末尾留下了逗号。像这样:

testSummary.lowerLimit = 2224.0,
testSummary.upperLimit = 2409.0,

这有效地将标量值转换为单值元组,SQLAlchemy不知道该如何处理。因此ProgrammingError例外。

您现在必须已经解决了您的问题,但是我发了帖,因为这是在网络上搜索此异常时的第一批结果。