如何在__init__.py中创建SQLAlchemy表?

时间:2016-06-02 11:46:33

标签: python-3.x flask sqlalchemy flask-login

我正在处理一个我想要添加用户模型的应用程序。传统上,应用程序是通过python3 runserver.py启动的,但我需要一种创建管理员的机制,所以我添加了这个功能:

def create_admin():
    username = input("Please enter username: ")
    # "select * from user where user.username = username;"
    q = db.session.query(User).filter(User.username == username)
    # if that user exists, don't create it
    if db.session.query(q.exists()).scalar():
        print("User already exists. Exiting.", file=sys.stderr)
        sys.exit(1)
    # otherwise, create it and commit to db
    password = getpass.getpass("Please enter password (it will not be echoed): ")
    admin = User(username, password=password, admin=True)
    db.session.add(admin)
    db.session.commit()

这将从项目foo导入,其__init__.py看起来像这样:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_socketio import SocketIO
from flask.ext.login import LoginManager
import tempfile
import os

app = Flask(__name__)
sqllite_uri = os.path.join('sqlite:///{}'.format(tempfile.gettempdir()), 'test.db')
app.config['SQLALCHEMY_DATABASE_URI'] = sqllite_uri
db = SQLAlchemy(app)

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'

socketio = SocketIO(app)

from foo.models import create_admin
from foo import views, models

问题是这些表是作为runserver.py的一部分在__main__内创建的,因此当我从命令行调用create_admin时,表格不会被删除存在。

我将db.create_all()作为create_admin()中的第一行有效,但如果我需要创建多个管理员,则会失败。这告诉我用户模型没有任何问题。此外,这使我认为在第一次导入foo时创建表格会更好。

我尝试在db.create_all()内创建db对象后直接添加__init__.py,但我仍然从我的create_admin调用中获得例外,因为我的用户表格没有&#39}存在。 db.create_all()目前还不知道这些表格,这让我觉得我需要导入模型。

有没有办法在__init__.py中创建我忽略的表格?可能foo.model中的表格在创建db时未被查看,但我无法弄清楚如何在__init__.py中导入模型。< / p>

编辑:我有一个解决方法,但我不喜欢它:

  1. python3 runsersever.py创建表格
  2. ^ C退出
  3. 创建管理员...
  4. 重新启动服务器。
  5. ???
  6. 利润。

1 个答案:

答案 0 :(得分:0)

我目前的解决方案:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_socketio import SocketIO
from flask.ext.login import LoginManager
import tempfile
import os

app = Flask(__name__)
sqllite_uri = os.path.join('sqlite:///{}'.format(tempfile.gettempdir()), 'test.db')
app.config['SQLALCHEMY_DATABASE_URI'] = sqllite_uri
db = SQLAlchemy(app)

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'

socketio = SocketIO(app)

from foo.models import create_admin
from foo import views, models

db.create_all()

解释:

当我们准备创建表格时(即通过调用db.create_all()),所有表格都是已知的,因为模型已从foo导入。

这可能不是这样做的惯用方式,但我会将其发布给未来的用户。我仍然愿意接受更好的选择!