Python 3.x 我如何在_uinit__uy.py中创建SQLAlchemy表?
我正在开发一个我想添加用户模型的应用程序。传统上,应用程序是通过python3 runserver.py启动的,但我需要一种创建管理员的机制,因此我添加了以下功能: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
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()