2016-08-10 5 views
1

SQLAlchemy에서 잘 작동하는 것들을 작성했지만 Flask에서 작업 할 때 동일한 워크 플로/명령이 왜곡 된 것처럼 보입니다. 예를 들어, 라인의 이러한 유형은 "정의되지 않은"것으로 표시 얻고있다 :Flask 프레임 워크에서 SQLAlchemy를 다르게 사용하는 방법

metadata = MetaData(db) 

abc = Table('abc', metadata, autoload=True) 

s = select([abc.name]) 

나는 상단에 flask.ext.sqlalchemy 수입 SQLAlchemy의에서 가 않습니다.

추가적으로 또는 대신해야 할 일이 있습니까?

SQLAlchemy 당신에게 해당 모듈 내부의 이름에 대한 직접 액세스를 제공하지 않습니다 가져 오기

+0

가상 환경에 SQLAlchemy를 설치 했습니까? – SumanKalyan

+0

이 동작은 분명히 'flask_sqlachemy'를 명백하게 처리하지 않은 것처럼 "native"또는 "real"'sqlalchemy' 인 것처럼 처리하려고 시도한 것이 분명합니다. ['flask_sqlachemy' 문서] (http://flask-sqlalchemy.pocoo.org/2.1/)에서 권장하거나 문서화 한 코드는 없습니다. 차이점에 명시 적으로 플래그가 지정되어 있으면 도움이 될 것입니다. 처음 플라스크를 사용했을 때와 똑같은 실수를 저질 렀습니다. – holdenweb

답변

3

을 (참고로, 나는 pythonanywhere 그것을 실행하는거야). 또한 flask_sqlalchemy (이전의 flask.ext.sqlalchemy) 모듈을 사용하면 SQLAlchemy 기능에 액세스하는 다소 다른 메커니즘을 사용한다는 점도 알아야합니다. 즉, SQLAlchemy의 최신 지식을 이전하려고 시도하면 flask_sqlalchemy documentation에 대한 정보가 제공됩니다.

일반적으로 Flask 응용 프로그램을 만든 다음 SQLAlchemyas in this example에 대한 호출로 전달합니다. 관련 코드는 아래와 같습니다. 당신은 다음과 같은 방법으로 테이블/모델을 정의 할 수 있습니다

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db' 
db = SQLAlchemy(app) 

db 객체는 현재 속성과 Model, Column 및 다양한 데이터 유형이있다.

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(80), unique=True) 
    email = db.Column(db.String(120), unique=True) 

    def __init__(self, username, email): 
     self.username = username 
     self.email = email 

    def __repr__(self): 
     return '<User %r>' % self.username 

단순히 모듈에서 그들을 수입하고이 규정 사용하는 것보다 오히려 db 네임 스페이스 내부의 다양한 이름을 한정 나를 강제로하기 때문에 개인적으로,이 특정 액세스 모델을 좋아 아니지만, 그것을 작동하는 것 같다 (적어도 상대적으로 복잡하지 않은 데이터베이스의 경우).

경험 많은 SQLAlchemy 사용자는 예상치 못한 스레드/웹 세션 상호 작용으로 인해 미묘한 버그에 취약해질 수 있지만 표준 액세스 메커니즘을 사용하는 것이 좋습니다. 또한 여러 데이터베이스를 배포하는 것이 까다로울 수 있다고 들었습니다. 나는 이것에 대한 직접적인 증거가 없으니, 일화로 간주하십시오.

+0

'flask.ext.foo' 형식의 확장 가져 오기는 [deprecated] (http://flask.pocoo.org/docs/0.11/upgrading/#extension-imports)이므로'flask_foo'를 사용해야합니다. – roy

+0

고마워, 대답을 수정했습니다 – holdenweb

+0

마음에 들지 않으면'db.'를 사용할 필요가 없습니다. 여전히 sqlalchemy에서 직접 가져올 수 있습니다. 그것은 단지 지름길입니다. – davidism