2013-03-03 6 views
1

sqlalchemy를 처음 사용하고 새로운 문제가 생겼습니다. 새 행의 일부만 삽입하는 방법을 찾을 수 없습니다. session.add()으로 모든 열을 지정하면 행을 삽입 할 수 있습니다. 하지만 일부 열만주고 싶다면 어떻게해야합니까? 인터넷에 sqlalchemy : 행의 일부만 삽입하십시오.

, 나는 (나는 아직 완전히이 라인을 이해하지 않도록 프로그래밍 신규)

내가

을 수입 .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)

내가 뭘 잘못하고 있니?

답변

1

'부분 삽입'은 전체 삽입과 동일하지만 지정하지 않은 값은 NULL으로 남습니다. 데이터베이스에서는 NULL 값을 생략 한 열의 스키마에 지정된 기본값으로 바꿀 수 있습니다.

SQLAlchemy에서 이는 동일한 열을 None으로 설정한다는 것을 의미합니다. 당신은 명시 적으로 그렇게 할 필요조차 없습니다.

Users 클래스에서__init__ 메서드가 필요하지 않습니다. 이것은 아마도 열의 일부를 지정하지 않기가 더 어려워 질 것입니다. SQLAlchemy 선언 기본은 이 이미이면서 기본값을 유지하는 기본값 인 __init__ 메서드를 제공합니다.

당신이 Burhan입니다의 대답처럼 None 열 값을 모두 __init__을 제거하거나 __init__ 방법은 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())를 사용 'empty'행 (이 (가)__init__이 모두 삭제 된 경우에도 작동합니다).

+0

당신이 나에게 코드의 라인이 어떻게 보일지의 예를 들어 주실 수 있습니까? 전체 행을 추가하는 방법을 찾았습니다. 그러나 일부만 채우기위한 올바른 구문은 아닙니다. 문제는 50 개 이상의 열이있는 테이블입니다. 한 번에 채우기가 짜증이났다. –

+0

@ 한데데 : '전체 줄'을 추가 할 때 무엇이 ​​보이고, * 무엇을 볼 수 있습니까? 관계형 데이터베이스는 '부분 행'삽입을 지원하지 않습니다. 생략 한 열의 기본값 만 포함합니다. –

+0

그래서 부르 한 칼리드가 제안한 방식을 사용해야합니까? 1 개의 전체 행을 삽입 한 후 업데이트하십시오. –

0

당신이 declarative base을 사용하고 있기 때문에, 당신은 간단하게 수행 할 수 있습니다

u = Users('foo',None,None) 
session.add(u) 
session.commit() 
+0

Jep이 제가 일한 버전 이었지만이 방법이 못생긴 것보다 50+ 열이있는 테이블이 있습니다 –

+0

실제 문제는 무엇입니까? 테이블이'nullable = True'로 셋업되어 있다면, 당신은 정말로 문제가 없습니다. –

+0

감사합니다. –