如何使用 sqlalchemy 插入版本 table 的系统?

How to insert into a system versioned table with sqlalchemy?

我正在为数据库中的表获取 类,如下所示:

import sqlalchemy as sa
import sqlalchemy.ext.automap

eng = sa.create_engine(CONNECTION_URL)
Base = sa.ext.automap.automap_base()
Base.prepare(eng, reflect=True)
Session = sa.orm.sessionmaker(bind=eng)

Table1 = Base.classes.Table1

在我的例子中,表 1 是 system versioned which I understand sqlalchemy doesn't explicitly support

当运行以下代码时:

t = Table1(field1=1, field2=3)
with Session() as session:
    session.add(t)
    session.commit()

我收到以下错误:

[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot insert explicit value into a GENERATED ALWAYS column in table 'DBName.dbo.Table1'. Use INSERT with a column list to exclude the GENERATED ALWAYS column, or insert a DEFAULT into GENERATED ALWAYS column. (13536) (SQLExecDirectW);

我知道这可能与 ValidToValidFrom 列有关

Table1.__table__.columns.keys()
# Column('ValidFrom', DATETIME2(), table=<Table1>, nullable=False)
# Column('ValidTo', DATETIME2(), table=<Table1>, nullable=False)

如何告诉 sqlalchemy 在插入语句期间忽略这些列?

编辑

我猜下面是 create 语句的相关部分?

CREATE TABLE [dbo].[Table1]
    [TableID] [int] NOT NULL IDENTITY,
    ...
    [ValidFrom] [datetime2](7) GENERATED ALWAYS AS ROW START NOT NULL,
    [ValidTo] [datetime2](7) GENERATED ALWAYS AS ROW END NOT NULL

我在下面使用 sqlalchemy 获得了这段代码。

CREATE TABLE dbo.Customer2
(  
  Id INT NOT NULL PRIMARY KEY CLUSTERED,
  Name NVARCHAR(100) NOT NULL, 
  StartTime DATETIME2 GENERATED ALWAYS AS ROW START 
               NOT NULL,
  EndTime   DATETIME2 GENERATED ALWAYS AS ROW END
              NOT NULL ,
  PERIOD FOR SYSTEM_TIME (StartTime, EndTime)   
) 
WITH(SYSTEM_VERSIONING=ON (HISTORY_TABLE=dbo.CustomerHistory2))

如果 StartTime / EndTime 列是隐藏的(这些不是),那么插入语句中不需要值,您可以只添加所需的值。但是,我的 table 中的日期列是必需的,因此使用默认值。

sql = "INSERT INTO dbo.Customer2 VALUES (2,'Someone else', default,default)"

print(sql)

with engine.connect() as con:
    rs = con.execute(sql)