【问题标题】:Cant create database using SQLalchemy, Flask might not be running my main method?无法使用 SQLalchemy 创建数据库,Flask 可能没有运行我的主要方法?
【发布时间】:2020-09-12 09:23:27
【问题描述】:

我一直在 talkpython 上学习 FLask/SQLalchemy 教程,但我无法让 SQLalchemy 创建我的 SQLite 数据库。

此时我怀疑它是否正在运行 main 方法,因为终端调试设置为 0,并且从未打印过 main() 的打印语句。

我真的不知道我做错了什么,站点午餐,我可以浏览它,但是在 db 文件夹中没有创建任何 SQLite 文件。

app.py:

import os
import flask
import data.db_session as db_session

app = flask.Flask(__name__)


def main():
    print("print this if coming from main()")
    setup_db()
    app.run(debug=True)


def setup_db():
    db_file = os.path.join(
        os.path.dirname(__file__),
        'db',
        'database.sqlite')

    db_session.global_init(db_file)


@app.route('/')
def frontpage():
    return flask.render_template('index.html')


if __name__ == '__main__':
    main()

db_session.py:

import sqlalchemy as sa
import sqlalchemy.orm as orm

from data.modelbase import SqlAlchemyBase

factory = None


def global_init(db_file: str):
    global factory

    if factory:
        return

    if not db_file or not db_file.strip():
        raise Exception("You must specify a db file.")

    conn_str = 'sqlite:///' + db_file.strip()
    print("Connecting to DB with {}".format(conn_str))

    engine = sa.create_engine(conn_str, echo=False, connect_args={"check_same_thread": False})
    factory = orm.sessionmaker(bind=engine)

    # noinspection PyUnresolvedReferences
    from data.location import Location

    SqlAlchemyBase.metadata.create_all(engine)

终端输出:

FLASK_APP = app.py
FLASK_ENV = development
FLASK_DEBUG = 0
In folder C:/Users/******/OneDrive/*********
"C:\Users\****\Anaconda3\envs\********\python.exe" -m flask run
 * Serving Flask app "app.py"
 * Environment: development
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

【问题讨论】:

    标签: python flask sqlalchemy pycharm


    【解决方案1】:

    要调用你的 main 方法,你可以像这样从命令行启动应用程序:

    "C:\Users\****\Anaconda3\envs\********\python.exe" app.py
    

    通过这样做,您的if __name__=="__main__" 语句将评估为True 并调用您的main() 函数。

    这里是a helpful, relevant, but much longer, answer that relates to this,它解释了使用这种方法启动应用程序的一些复杂性。

    【讨论】:

    • 嗨 captnsupremo,感谢您抽出宝贵时间尝试帮助我 :) 因为现在是网站午餐,所以我猜它可能以某种方式到达 app.run?但我从未在 main() 打印中看到我的 print 语句,也没有看到 setup_db() 在我的 db 文件夹中创建任何 sqlite 文件。虽然 debug 设置为 true,但当应用程序运行时它设置为 0
    • 没错——只要你像在app = flask.Flask(__name__) 中那样创建了应用程序,flask 就可以在不调用 main() 函数的情况下启动你的应用程序。这是一个快速入门教程,展示了 Flask 这样做:flask.palletsprojects.com/en/1.1.x/quickstart 在这种情况下,Flask 永远不会运行您的 app.run() 行,甚至是您的 main 函数。为了让flask真正运行你的main()函数,你需要用python解释器来启动它,如上所述。
    • @captnsupremo 谢谢你,你是圣人。我仍然不太明白为什么它会这样工作,但现在打印正在打印并且数据库正在连接。但我想这意味着在 pycharm 中做事的整个方式是愚蠢的还是?你有没有机会知道如何 curcom 去这个,或者如何设置 pycharm 以便我可以在 pycharm 中使用绿色运行箭头?非常感谢您的帮助,我今天大部分时间都在处理这个问题
    • 对不起,您的一天失去了!我对pycharm没有任何经验。如果您将 setup_db() 函数调用移动到全局命名空间(即,只需将其拉到 main() 函数之外),那么您应该能够使用您原来的“python -m flask run”命令,它仍然会执行您的脚本,调用 setup_db()。不过,我不知道这是否是你想要的。
    猜你喜欢
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    相关资源
    最近更新 更多