如何告诉sqlalchemy在插入时忽略某些列(比如null)

2024-06-16 12:58:51 发布

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

我有一个遗留数据库,它使用各种存储过程为多个列创建默认值。尝试追踪名称并在代码中添加查询或多或少会让人望而却步,更别提维护的噩梦了。在

我希望能够告诉sqlalchemy忽略我并不真正关心的列。不幸的是,它没有提供违反DB约束的null值。在

我的意思是:

import sqlalchemy as sa
import logging
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

l = logging.getLogger('sqlalchemy.engine')
l.setLevel(logging.INFO)
l.addHandler(logging.StreamHandler())




engine = sa.create_engine('postgresql+psycopg2://user@host:port/dbname')

Session = sessionmaker(bind=engine)
session = Session()
temp_metadata = sa.MetaData(schema='pg_temp')
TempBase = declarative_base(metadata=temp_metadata)

with session.begin(subtransactions=True):
    session.execute('''
        CREATE TABLE pg_temp.whatevs (
            id      serial
          , fnord   text not null default 'fnord'
          , value   text not null
        );

        INSERT INTO pg_temp.whatevs (value) VALUES ('something cool');
    ''')

    class Whatever(TempBase):
        __tablename__ = 'whatevs'

        id = sa.Column('id', sa.Integer, primary_key=True, autoincrement=True)
        fnord = sa.Column('fnord', sa.String)
        value = sa.Column('value', sa.String)

    w = Whatever(value='something cool')
    session.add(w)

这是因为:

^{pr2}$

我所期望的是它将跳过fnord列,因为它没有被设置。在

即使我做了:

w = Whatever()
w.value = 'this breaks too'

或添加:

def __init__(self, value):
    self.value = value

Whatever类。。。还是没有骰子。在

我怎么能告诉sqlalchemy“看,这些其他的列都很好,我知道我没有提供值-数据库将为我处理这个问题。没关系,别担心这些专栏“?在

我所知道的唯一方法就是用类定义和谎言,说那些列不存在。。。但我真的希望他们能参与查询。在


Tags: importtruesqlalchemyvaluesessionloggingsanull
1条回答
网友
1楼 · 发布于 2024-06-16 12:58:51

fnord添加带有^{}server side default

class Whatever(TempBase):
    __tablename__ = 'whatevs'

    id = sa.Column(sa.Integer, primary_key=True, autoincrement=True)
    fnord = sa.Column(sa.String, nullable=False, server_default='fnord')
    value = sa.Column(sa.String, nullable=False)

SQLAlchemy非常乐意让默认值在服务器端完成它的工作,如果只是告诉它的话。如果您的列在DDL中没有默认设置,但是through triggers,那么请查看^{}。在

SQLite测试:

^{pr2}$

相关问题 更多 >