从单独的文件 Flask SQLAlchemy python3 访问数据库

Pau*_*ven 1 python sqlite flask python-3.x flask-sqlalchemy

我正在编写一个烧瓶应用程序。我有两个文件。main.py 和databases.py。我想从database.py 文件创建一个数据库。main.py 应访问databases.py 文件并创建名为“Users”的数据库和表。但它显示导入错误。帮我解决这个问题

主要.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from databases import User

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/data_log.db'
db = SQLAlchemy(app)

if __name__ == '__main__':
    db.create_all()
    app.run(host='0.0.0.0', port=5001)  
Run Code Online (Sandbox Code Playgroud)

数据库.py

from main import db
from passlib.apps import custom_app_context as pwd_context

class User(db.Model) :
    __tablename__ = 'users'
    user_id     =   db.Column(db.Integer, primary_key = True)
    username    =   db.Column(db.String(32), index = True)
    password    =   db.Column(db.String(128))
    def hash_password(self, password) :
        self.password =pwd_context.hash(password)
    def verify_password(self, password) :
        return pwd_context.verify(password, self.password)
Run Code Online (Sandbox Code Playgroud)

追溯:

Traceback (most recent call last):
  File "main.py", line 3, in <module>
    from databases import User
  File "/home/paulsteven/stack/databases.py", line 1, in <module>
    from main import db
  File "/home/paulsteven/stack/main.py", line 3, in <module>
    from databases import User
ImportError: cannot import name 'User'
Run Code Online (Sandbox Code Playgroud)

Rom*_*est 5

这是周期性进口冲突的常见情况。回溯为您提供了清晰的步骤:

步骤如何进行:

  • 你跑main.py
  • 控制流开始导入功能/库,直到到达第三行 from databases import User
  • 它会转到databases模块来查找所需的User类。但是......User可能会使用外部作用域功能(并且它确实需要db.Model),因此控制流需要databases从一开始就扫描模块。"/home/paulsteven/stack/databases.py", line 1这反映了回溯 ( )的第二步
  • database.py从上一步在控制流遇到的位置开始from main import db-这意味着它应该返回到main( main.py) 模块!
  • 控制流返回到main模块,从第一行开始再次扫描,直到from databases import User 再次找到为止。这反映了回溯的第三步 ( File "/home/paulsteven/stack/main.py", line 3)
    • 然后你就陷入了循环......

解决问题的正确方法是什么?
将所有数据库上下文/数据库模型保留在单独的模块中。
遵循对象关系的顺序以及它们如何相互依赖:

---> 首先实例化应用程序 ( app)

  • ---> 然后数据库框架实例的创建db = SQLAlchemy(app)取决于app

    • ---> 然后User(db.Model)根据db实例创建自定义数据库模型(如)

主要.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# from databases import User  <--- shouldn't be here

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/data_log.db'
db = SQLAlchemy(app)

if __name__ == '__main__':
    from databases import User  #  after instantiating `db` import model(s) 
    db.create_all()
    app.run(host='0.0.0.0', port=5001)  
Run Code Online (Sandbox Code Playgroud)