首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“scoped_session”对象没有属性“create_all”“scoped_session”对象没有属性“session”

“scoped_session”对象没有属性“create_all”“scoped_session”对象没有属性“session”
EN

Stack Overflow用户
提问于 2020-05-11 11:30:34
回答 1查看 373关注 0票数 1

因此,我尝试使用flask和SQLAlchemy创建一个网站来存储数据库,但我不断收到上述两个错误

下面是我的app.py代码

代码语言:javascript
复制
import os

from flask import Flask, session,render_template, request
from flask_session import Session
from sqlalchemy import create_engine,Column, Integer, String
from sqlalchemy.orm import scoped_session, sessionmaker
from flask_sqlalchemy import SQLAlchemy
from models import *
app = Flask(__name__)

#app.config["DATABASE_URL"] = "sqlite:////plz_work.db"
app.config["SQLALCHEMY_DATABASE_URI"] = os.getenv("DATABASE_URL")
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
db.init_app(app)


# Check for environment variable
#if not os.getenv("DATABASE_URL"):
#    raise RuntimeError("DATABASE_URL is not set")

# Configure session to use filesystem
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app)

# Set up database
engine = create_engine(os.getenv("DATABASE_URL"))
db = scoped_session(sessionmaker(bind=engine))
class User:
    def __init__(self,username,password):
        self.username = username
        self.password = password


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

@app.route("/registration.html")
def registration():
    return render_template('registration.html')

@app.route("/send", methods = ['GET','POST'])
def send():
    username = request.form['username']
    password = request.form['password']
    users = User(username,password)
    db.session.add(users)
    db.session.commit()
    return render_template('index.html')

if __name__ == "__main__":
    app.run(debug = True)
    db.create_all()

这是我的models.py文件

代码语言:javascript
复制
import os

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class USERS(db.Model):
    __tablename__ = "Users"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String)
    password = db.Column(db.String)
def __repr__(self):
        value = "USER:({}, {})".format(self.username, self.password)
        return value

我已经在网上寻找了这么长时间的解决方案,但我找不到任何适合我的解决方案,我已经花了2天的时间来解决这个问题,任何帮助都将不胜感激。

谢谢你!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-11 21:38:56

我猜您正在覆盖models.py文件中的数据库对象。我建议您使用sqlalchemy本身或flask-sqlalchemy,而不是将它们一起使用。在我看来,如果你同时使用它们,事情就会变得复杂。

您可以像这样实现:

在你的app.py中

代码语言:javascript
复制
...your_other_imports...
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from .models import *

app = Flask(__name__)

...your_other_configs...

# Set up database
engine = create_engine(os.getenv("DATABASE_URL"))
db = scoped_session(sessionmaker(bind=engine))
#NOW db carries your database session
#Do not define your database models in app.py remove User class from here.
#You should define your database model and also your query method (not necessary)
#if you're used to query with flask-sqlalchemy. Would make queries look similar to you
dbModel = declarative_base()
dbModel.query = db.query_property()

# define the function which will create your tables
def init_db():
    from .models import *
    dbModel.metadata.create_all(bind=engine)

...your_routes...

if __name__ == "__main__":
    app.run(debug = True)

    # now call the function to create your tables
    init_db()

在你的models.py中

代码语言:javascript
复制
from .app import dbModel
from sqlalchemy import Column, Integer, String

class User(dbModel):
    __tablename__ = "users"
    id = Columnn(Integer, primary_key=True)
    username = Column(String)
    password = Column(String)
    def __repr__(self):
        value = "USER:({}, {})".format(self.username, self.password)
        return value

使用query_property,您现在可以从数据库中查询数据,并使用会话将数据放入数据库中,如下所示:

代码语言:javascript
复制
User.query.filter_by(username=...).first()

newUser = User(
        username=...,
        password=...
    )
db.add(newUser)
db.commit()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61721845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档