python-Flask-sqlalchemy: sqlalchemy.экскавация.InvalidRequestError

Я создаю бэкэнд для моего приложения iOS,и я решил использовать фреймворк Flask.

Часть flask-sqlalchemyбазы данных используется для подключения mysqlбазы данных.

Когда я помещаю весь мой тестовый код в один файл, все работает хорошо.

test.py

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql://root:pwd@localhost/test"
db = SQLAlchemy(app)


class player(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.create_all()

Однако, когда я разделил код на разные файлы, чтобы сделать весь проект структурированным, я получил ошибку.

Вот моя структура файлов:

.
├── config.py
├── app.py
├── app
    ├── __init__.py
    ├── api.py
    └── models.py
└── venv

config.py

SQLALCHEMY_DATABASE_URI = "mysql://root:pwd@localhost/test"

app.py

from app import app

if __name__ == '__main__':
    app.run(debug=True)

__init.py__

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

import config

app = Flask(__name__)
app.config.from_object("config")
db = SQLAlchemy(app)

import models
db.create_all()

models.py

from app import db

class player(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

Когда я бежал__init__.py, чтобы создать все таблицыmodels.py, я получил ошибку

sqlalchemy.экскавация.InvalidRequestError: таблица ‘player’ уже определена для этого экземпляра метаданных. Укажите ‘extend_existing=True’ для переопределения параметров и столбцов существующего объекта таблицы.

И когда я проверил базу данных, я обнаружил, что таблица playerсоздана.

Похоже, что sqlalchemy пытается создавать таблицы неоднократно.

Почему это?

1 ответ

  1. пытаться

    from app import models
    

    вместо

    import models
    

    создается циклический импорт. Дополнительные сведения о циклическом импорте см. По этой ссылке