db2 SQLAlchemy从非空列中选择一个空值插入

3lxsmp7m  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(245)

这将被视为一个挑战,只是为了知道是否有一种方法来“解决”这个问题。
我正在学习SQLAlchemy核心,现在面临从选择插入,我有这个问题
我正在从一个带有预览插入信息的表中选择信息(关于芝加哥几所学校的多个信息)。这个表有几列,但我想要的是其中的3列。

Select_stmt = select(chicago_schools_manual.columns['Name_of_School'], chicago_schools_manual.columns['Safety_Score'], chicago_schools_manual.columns['Location'])

使用SqlAlchemy将表手动Map为Table,如下所示:

('School_ID', Column('School ID', Integer(), table=<chicago_schools>, key='School_ID', primary_key=True, nullable=False))
('Name_of_School', Column('Name of School', String(), table=<chicago_schools>, key='Name_of_School'))
('Safety_Score', Column('Safety Score', Float(), table=<chicago_schools>, key='Safety_Score'))
('Location', Column('Location', String(), table=<chicago_schools>))

我正在将此信息插入到新表中。这是新表Map:

NiceSchools = Table(
   'NiceSchools', metadata, 
   Column('id', Integer, primary_key = True, autoincrement = True), 
   Column('name', String (255), index = True, nullable = False), 
   Column('Safety_Score', Float, nullable = False, default = 0),
   Column('Location', String(50), nullable = False), 
   Column('Start_date', DateTime, default = datetime.today())

下面是插入语句:

Insert_stmt = insert(NiceSchools).from_select(['name', 'Safety_Score', 'Location'], Select_stmt)

我面临两个问题:
1.来源列中的字段“安全分数”有时为空(源表没有非空的约束),所以在新表中插入的时候,空值会导致SQL错误,我以为有默认值就可以解决了(尝试插入null将替换默认值),但没有。我找到了一些关于postgreessql子句“on conflict”的信息,可以解决,但我使用的是DB2。如何“调整”代码以避免在新表中插入空信息?

  1. Name of Schools字段是源上的CLOB,有时名称比destiny字段大(当前为255,但以前的字段较小)。因此,如何截断传入的字符串以适合目标?
    观察结果:我试图在SqlAlchemy中完成所有这些工作,因此,我需要在SqlAlchemy中使用任何SQL原生函数。
    提前感谢!
ru9i0ody

ru9i0ody1#

酒保在上面贴出了一些有用的功能。谢谢!
这样使用的一个例子。特别是因为这样的功能在SQLA网站上描述的不多。

Select_stmt = select(func.SUBSTR(chicago_schools_manual.columns['Name_of_School'],1,50), func.coalesce(chicago_schools_manual.columns['Safety_Score'], 999), chicago_schools_manual.columns['Location']).order_by(chicago_schools_manual.columns['Safety_Score'].desc())

和插入执行(无特殊功能)

Insert_stmt = insert(NiceSchools).from_select(['name', 'Safety_Score', 'Location'], Select_stmt)
with engine.begin() as conn:
    conn.execute(Insert_stmt)

相关问题