programing

SQLAlchemy create_all()이 테이블을 생성하지 않습니다.

abcjava 2023. 5. 6. 13:59
반응형

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

반응형