1

私は sqlalchemy を初めて使用し、問題に遭遇しました。新しい行の一部だけを挿入する方法が見つかりません。すべてのsession.add()列を指定すると、行を挿入できます。しかし、いくつかの列だけを指定したい場合はどうすればよいでしょうか?

インターネット上で、.insert()

sqlalchemy.sql.expression.insert(table, values=None, inline=False, **kwargs)

(プログラミングは初めてなので、これらの行をまだ完全には理解していません)

輸入しました

import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column, Integer, String, ForeignKey, Boolean
from sqlalchemy.orm import relationship, backref
from sqlalchemy.orm import sessionmaker
from sqlalchemy.sql.expression import insert

Base = declarative_base()
engine = create_engine('sqlite:///test.db')

class Users(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String, unique=True)
    password = Column(String)
    email = Column(String)

    def __init__(self, name, password, email):
        self.name = name
        self.password = password
        self.email = email

Session = sessionmaker(bind=engine)
Session.configure(bind=engine)
session = Session()

session.add(users.insert().values(name="some name"))

この最後の行で AttributeError が発生し続けます。(Users has no attribute insert)

私は何を間違っていますか?

4

2 に答える 2

1

「部分的な」挿入は、完全な挿入とまったく同じ意味ですが、指定しない値では、leftを。として指定しますNULLNULLデータベースは、省略した列のスキーマで指定されたデフォルトで値を置き換えることができます。

SQLAlchemyでは、同じ列をNone;に設定することを意味します。明示的に行う必要はありません。

クラスにメソッドは必要ないことに注意してください。これにより、一部の列を指定しないことが難しくなっている可能性があります。SQLAlchemy宣言型ベースは、既に必要なことを実行するだけでなく、デフォルトを保持するデフォルトのメソッドを提供します。__init__Users__init__

__init__完全に削除したくない場合は、その__init__メソッドをデフォルトに変更するか、Burhanの回答のように列の値をNone明示的に指定します。None

class Users(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String, unique=True)
    password = Column(String)
    email = Column(String)

    def __init__(self, name=None, password=None, email=None):
        self.name = name
        self.password = password
        self.email = email

次に、を使用して完全に「空の」行を挿入します(これは、完全に削除session.add(Users())した場合にも機能します)。__init__

于 2013-03-03T10:26:49.797 に答える
0

宣言型ベースを使用しているので、次のようにすることができます。

u = Users('foo',None,None)
session.add(u)
session.commit()
于 2013-03-03T10:31:16.223 に答える