さまざまなストアドプロシージャを使用していくつかの列のデフォルト値を作成するレガシーデータベースがあります。メンテナンスの悪夢はもちろんのこと、名前を追跡したり、コードにクエリを追加することは、多かれ少なかれ禁止されています。sqlalchemyにINSERTの特定の(ヌル)列を無視するように指示するには
私はのようにのように、私が本当に気にしない列を無視するようにsqlalchemyに指示することができます。残念ながら、それはしません。代わりに、null
の値はDB制約に違反しています。ここで
は、私が何を意味するかの例です:
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://[email protected]: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)
これはbarfs、ので:私はを期待することは、それはそれ以来、fnord
カラム上でスキップするだろうということです
INSERT INTO pg_temp.whatevs (fnord, value) VALUES (%(fnord)s, %(value)s) RETURNING pg_temp.whatevs.id
{'fnord': None, 'value': 'something cool'}
ROLLBACK
Traceback (most recent call last):
File "/home/wayne/.virtualenvs/myenv/lib64/python3.5/site-packages/sqlalchemy/engine/base.py", line 1139, in _execute_context
context)
File "/home/wayne/.virtualenvs/myenv/lib64/python3.5/site-packages/sqlalchemy/engine/default.py", line 450, in do_execute
cursor.execute(statement, parameters)
psycopg2.IntegrityError: null value in column "fnord" violates not-null constraint
DETAIL: Failing row contains (2, null, something cool).
設定されていませんでした。私がやる場合でも
:
w = Whatever()
w.value = 'this breaks too'
または追加します。
def __init__(self, value):
self.value = value
をWhatever
クラスに...まだサイコロ。
どのようにsqlalchemyに「見て、これらの他の列は大丈夫ですか、私は値を提供していないことを知っています - データベースはそれを世話します。これらの列 "?
私が知っている唯一の方法は、クラス定義とfutzして、それらの列は存在しないと言っているが... doは実際にクエリに来ることを望んでいる。
に見えます! –