插入tab时处理SQLAlchemy中的触发器

2024-06-25 23:11:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我曾使用flask SQLAlchemy在数据库中映射一个名为Proposal的表,但是在从应用程序插入数据库时遇到了一个问题。错误如下:

sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42000', "[42000]

[Microsoft][ODBC SQL Server Driver][SQL Server]The target table 'Proposal' of
the DML statement cannot have any enabled triggers if the statement contain an
OUTPUT clause without INTO clause. (334) (SQLExecDirectW); [42000] [Microsoft]
[ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared

数据库为MSSQL类型。在

SQLAlchemy生成的sql语句是

^{pr2}$

我知道当我禁用触发器时,insert可以工作,但是我需要一个sqlalchemy中的解决方案来解决这个问题?在

有什么办法吗?


Tags: the数据库应用程序flasksqlserversqlalchemydriver
2条回答

如果在表类上进行映射,这将不起作用。对于SqlAlchemy 1.2.7,implicit_returning可以通过为insert()设置参数inline=Truedocumentation-检查insert部分中的“input”参数)来关闭implicit_returning。在

下面是我的实现,它还利用sessionmaker运行查询:

from sqlalchemy.orm import mapper, sessionmaker
from sqlalchemy import MetaData, create_engine, Table

class User(object):
    pass

def CreateUser(event):
    #Retrieve event
    email = event["email"]
    firstName = event["firstName"]
    lastName = event["lastName"]

    #Create connection
    conn_str = "mssql+pymssql://<username>:<password>@<rds_host>:1433/<db_name>"
    engine = create_engine(conn_str)
    metadata = MetaData(engine, reflect=True)

    #Create session
    Session = sessionmaker()
    Session.configure(bind=engine)
    session = Session()

    #Retrieve DB table
    users = Table("tblUser", metadata, autoload=True)
    mapper(User, users)

    #Insert record
    isInline = True
    insert = users.insert(None, isInline).values(FirstName=firstName, LastName=lastName, Email=email)
    session.execute(insert)
    session.commit()

我意识到我必须删除输出子句,并找到了推荐的解决方案:

__table_args__ = {'implicit_returning':False}

为建议表创建类时。在

相关问题 更多 >