SQLAlchemy create_all()이 테이블을 생성하지 않습니다.
저는 Postgre를 통합하려고 합니다.SQL 및 SQLAlchemy이지만 SQLAlchemy.create_all()이 내 모델에서 테이블을 만들지 않습니다.
내 코드:
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://login:pass@localhost/flask_app'
db = SQLAlchemy(app)
db.create_all()
db.session.commit()
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
admin = User('admin', 'admin@example.com')
guest = User('guest', 'guest@example.com')
db.session.add(admin)
db.session.add(guest)
db.session.commit()
users = User.query.all()
print users
하지만 다음과 같은 오류가 발생합니다.sqlalchemy.exc.ProgrammingError: (ProgrammingError) relation "user" does not exist
이걸 어떻게 고칠 수 있을까요?
당신은 당신의 모델 수업을 앞에 두어야 합니다.create_all()
다음과 같은 호출:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://login:pass@localhost/flask_app'
db = SQLAlchemy(app)
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
with app.app_context():
db.create_all()
db.session.add(User('admin', 'admin@example.com'))
db.session.add(User('guest', 'guest@example.com'))
db.session.commit()
users = User.query.all()
print(users)
모델이 별도의 모듈에 선언된 경우 호출하기 전에 모델을 수행합니다.create_all()
.
저기, 그.User
모델이 다음 파일에 있습니다.models.py
,
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql+psycopg2://login:pass@localhost/flask_app'
db = SQLAlchemy(app)
# See important note below
from models import User
with app.app_context():
db.create_all()
db.session.add(User('admin', 'admin@example.com'))
db.session.add(User('guest', 'guest@example.com'))
db.session.commit()
users = User.query.all()
print(users)
중요한 참고:초기화 후 모델을 가져오는 것이 중요합니다.db
이후로 이의 제기, 당신 안에서.models.py
또한 당신은 그것을 가져올 필요가 있습니다.db
이 모듈의 개체입니다.
각 모델 전용 파일을 사용하여 테이블을 만드는 데 문제가 있는 경우 "create_all" 함수가 선언된 파일과 다른 파일에서 실행된다는 점에 유의하십시오.파일 시스템이 다음과 같은 경우:
Root
--app.py <-- file from which app will be run
--models
----user.py <-- file with "User" model
----order.py <-- file with "Order" model
----database.py <-- file with database and "create_all" function declaration
app.py 에서 "create_all" 함수를 호출하지 않도록 주의하십시오.
이 개념은 @SuperShoot가 게시한 이 스레드에 대한 답변으로 더 잘 설명됩니다.
이것은 아마도 주요한 이유가 아닐 것입니다.create_all()
메소드 호출은 사람들에게 효과가 없지만, 다양한 튜토리얼의 지침을 한데 묶어서 요청 컨텍스트에서 DB를 생성하는 것과 같습니다. 즉, 다음과 같은 것이 있습니다.
# lib/db.py
from flask import g, current_app
from flask_sqlalchemy import SQLAlchemy
def get_db():
if 'db' not in g:
g.db = SQLAlchemy(current_app)
return g.db
또한 create_all을 수행하는 별도의 cli 명령도 있습니다.
# tasks/db.py
from lib.db import get_db
@current_app.cli.command('init-db')
def init_db():
db = get_db()
db.create_all()
저도 애플리케이션 팩토리를 사용하고 있습니다.
cli 명령을 실행하면 새 앱 컨텍스트가 사용됩니다. 즉, 새 DB가 사용됩니다.또한 init_db 메서드의 가져오기 모델은 모델 파일이 이미 로드되어 있고 별도의 db와 연결되어 있을 수 있으므로 아무 작업도 수행하지 않습니다.
제가 찾은 수정 사항은 DB가 단일 글로벌 참조인지 확인하는 것이었습니다.
# lib/db.py
from flask import g, current_app
from flask_sqlalchemy import SQLAlchemy
db = None
def get_db():
global db
if not db:
db = SQLAlchemy(current_app)
return db
저는 플라스크, sqlalchemy 또는 flask-sqlchemy에 대해 충분히 깊이 파고들지 않았습니다. 이것이 여러 스레드에서 db로 요청하는 것이 안전한지 여부를 의미하지만, 만약 당신이 이것을 읽고 있다면 당신은 이러한 개념들을 이해하는 초기 단계에 갇힐 가능성이 높습니다.
언급URL : https://stackoverflow.com/questions/20744277/sqlalchemy-create-all-does-not-create-tables
'programing' 카테고리의 다른 글
git: 새 파일을 포함한 모든 작업 dir 변경 실행 취소 (0) | 2023.05.06 |
---|---|
컬렉션이 있을 때 VBA에서 어레이를 사용하는 이유는 무엇입니까? (0) | 2023.05.06 |
치명적: 사용자 "postgres"에 대한 암호 인증 실패(pgAdmin 4에서 postgresql 11 이후) (0) | 2023.05.06 |
WPF 사용자 제어 상위 항목 (0) | 2023.05.06 |
iOS 프로젝트를 빌드하지 못했습니다."xcodebuild" 명령을 실행했지만 오류 코드 65와 함께 종료되었습니다. (0) | 2023.05.06 |