Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.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
从单独的文件SQLAlchemy python3访问数据库_Python_Python 3.x_Sqlite_Flask_Flask Sqlalchemy - Fatal编程技术网

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

从单独的文件SQLAlchemy python3访问数据库,python,python-3.x,sqlite,flask,flask-sqlalchemy,Python,Python 3.x,Sqlite,Flask,Flask Sqlalchemy,我正在写一份申请书。我有两个文件。main.py和databases.py。我想从database.py文件创建一个数据库。main.py应该访问databases.py文件并创建名为“Users”的数据库和表。但它显示了导入错误。帮我解决这个问题 main.py from flask import Flask from flask_sqlalchemy import SQLAlchemy from databases import User app = Flask(__name__) app

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

main.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)  
数据库.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)
回溯:

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'
回溯(最近一次呼叫最后一次):
文件“main.py”,第3行,在
从数据库导入用户
文件“/home/paulsteven/stack/databases.py”,第1行,在
从主导入数据库
文件“/home/paulsteven/stack/main.py”,第3行,在
从数据库导入用户
ImportError:无法导入名称“User”
这是循环导入冲突的常见情况。 回溯为您提供了清晰的步骤:

它是如何分步骤进行的:

  • 运行
    main.py
  • 控制流开始导入功能部件/库,直到获得第3行
    从数据库导入用户
  • 它转到
    数据库
    模块以查找所需的
    用户
    类。但是
    用户
    可以使用外部范围功能(并且它确实需要
    db.Model
    ),因此控制流需要从一开始就扫描
    数据库
    模块。这反映了回溯的第二步(
    “/home/paulsteven/stack/databases.py”,第1行
  • 从上一步位于
    database.py
    的位置开始,控制流遇到来自主导入db的
    ,这意味着它应该返回到
    main
    main.py
    )模块
  • 返回到
    模块的控制流再次从第1行开始扫描,直到从数据库中找到
    ,再次导入用户
    。这反映了回溯的第三步(
    文件/home/paulsteven/stack/main.py),第3行
    
    • 然后你进入了一个循环

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

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

  • --->然后根据
    app
    DB=SQLAlchemy(app)
    创建DB框架实例

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

main.py

从烧瓶导入烧瓶
从flask_sqlalchemy导入sqlalchemy

#从databases导入用户如何使用databases.py文件中的用户类在db中创建表???@PaulSteven,请参阅更新。实例化
db
后使用模型现在类已成功导入。即使尚未创建表。@PaulSteven,在
db.create\u all()
之后添加
db.session.commit()
即使在
db.create\u all()之后添加
db.session.commit()
也不会创建表。它只创建一个文件。
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)