我正在為資料庫中的表獲取類,如下所示:
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
在我的情況下 Table1 是系統版本,我知道 sqlalchemy 沒有明確支持。
運行以下代碼時:
t = Table1(field1=1, field2=3)
with Session() as session:
session.add(t)
session.commit()
我收到以下錯誤:
[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]無法將顯式值插入到表 'DBName.dbo.Table1' 的 GENERATED ALWAYS 列中。將 INSERT 與列串列一起使用以排除 GENERATED ALWAYS 列,或將 DEFAULT 插入 GENERATED ALWAYS 列。(13536) (SQLExecDirectW);
我知道這可能與ValidToandValidFrom列有關
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
uj5u.com熱心網友回復:
我在下面使用 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 列被隱藏(這些列不是),則插入陳述句中不需要值,您可以只添加所需的值。但是我表中的日期列是必需的,因此使用默認值。
sql = "INSERT INTO dbo.Customer2 VALUES (2,'Someone else', default,default)"
print(sql)
with engine.connect() as con:
rs = con.execute(sql)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/484680.html
