Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 我如何在_uinit__uy.py中创建SQLAlchemy表?_Python 3.x_Flask_Sqlalchemy_Flask Login - Fatal编程技术网

Python 3.x 我如何在_uinit__uy.py中创建SQLAlchemy表?

Python 3.x 我如何在_uinit__uy.py中创建SQLAlchemy表?,python-3.x,flask,sqlalchemy,flask-login,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(Us

我正在开发一个我想添加用户模型的应用程序。传统上,应用程序是通过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
导入,该项目的
\uuuu init\uuuu.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
中创建的,作为
\uuuuuu main\uuuuu
的一部分,因此当我从命令行调用
create\u admin
时,这些表不存在

我将
db.create\u all()
作为
create\u admin()
中的第一行,这行代码很有效,但是如果我需要创建多个管理员,它就会失败。这告诉我用户模型没有问题。此外,这使我认为最好在第一次导入
foo
时创建表

我尝试在
中创建
db
对象后直接添加
db.create\u all()
db.create_all()
此时不知道表,这使我认为需要导入模型

有没有一种方法可以在我忽略的
\uuuu init\uuuu.py
中创建表?在创建
db
时,可能看不到
foo.model
中的表,但我不知道如何在
中导入模型


编辑:我有一个变通办法,但我不喜欢:
  • python3运行sersever.py
    来创建表
  • ^C退出
  • 创建管理员
  • 重新启动服务器
  • 利润
  • 我当前的解决方案: 解释如下: 当我们准备好创建表时(即,通过调用
    db.create_all()
    ),所有表都是已知的,因为模型是从
    foo
    导入的


    这可能不是实现这一点的惯用方法,但我将为未来的用户发布它。我仍然有更好的选择

    为什么你觉得这不是惯用语?如果希望在模型定义之后执行
    db.create_all()
    ,那么最合理的放置位置是在导入模型定义之后。你想把db.create_all()
    放在哪里?@univerio我对python比较陌生。我没有说这不是惯用语,我只是发出警告,以防万一。不管怎样,都是地道的!=合乎逻辑。
    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()