【问题标题】:Flask not storing data to database烧瓶不将数据存储到数据库
【发布时间】:2021-09-04 15:51:54
【问题描述】:

数据库不存储烧瓶数据模型。即使创建了数据库。 使用 postrges,表是在 bash 视图中创建的,而不是在 pgAdmin 中创建的。我有一个需要存储数据的简单应用程序。非常感谢帮助。 代码使用 SQLAlchemy。我需要使用不同的库吗?我正在使用 psycopg2 和会话,但没有导入会话。

#!flask/bin/python
    #!flask/bin/python
          from os import linesep 
        from typing import Mapping, Type from flask
          import Flask,    jsonify 
    from flask import request 
      from slotscal import results 
     from flask_sqlalchemy 
     import SQLAlchemy
      import time 
      app = Flask(__name__)
    
    
    app.config['SQLALCHEMY_DATABASE_URI']= 'postgresql+psycopg2://postgres:test123@localhost:5432/hqw' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db=SQLAlchemy(app)
    
    
    
    db.metadata.clear()
        #add parenrts
    
    
    
    class Contracts(db.Model):
        name=db.Column(db.String(100))
        address=db.Column(db.String(42), unique=True, primary_key=True)
        fileName=db.Column(db.Integer)
        Functions= db.relationship('Function')
        Variables= db.relationship('Variable')
        StateVariables=db.relationship('StateVariable')
    
        def __init__(self,address,fileName,id,StateVariables,name):
            self.address=address
            self.fileName=fileName
            self.id=id
            self.StateVariables=StateVariables
            self.name=name
    
        
         class Function(db.Model):
        id=db.Column(db.String(42), db.ForeignKey('contracts.address'), primary_key=True)
        name=db.Column(db.String)
        lines=db.Column(db.Integer)
        ReachingTime=db.Column(db.DateTime)
        TrackingTime=db.Column(db.DateTime)
        Arguments= db.relationship('Arguments')
    
        def __init__(self,address,ReachingTime,id,TrackingTime,name,lines):
            self.address=address
            self.ReachingTime=ReachingTime
            self.TrackingTime=TrackingTime
            self.id=id
            self.lines=lines
            self.name=name
    
    class Argument(db.Model):
        id=db.Column(db.String(42), db.ForeignKey('function.id'), primary_key=True)
        Type=db.Column(db.String)
        Value=db.Column(db.String)
        Name=db.Column(db.String)
    
        def __init__(self,Name, id,Type,Value):
            self.Name=Name
            self.id=id
            self.Type=Type
            self.Value=Value
    
    class Variable(db.Model):
        
        VariableName=db.Column(db.String)
        id=db.Column(db.String(42),db.ForeignKey('contracts.address'),primary_key=True)
        Type=db.Column(db.String) 
        Value=db.Column(db.String)
        StateVaruiable=db.Column(db.Boolean)
        Mapping=db.Column(db.Boolean)
    
        def __init__(self,address,Value,Type,id,StateVariables,name):
            self.address=address
            self.Type=Type
            self.Value=Value
            self.id=id
            self.StateVariables=StateVariables
            self.name=name
        
    
    
    class m(db.Model): 
        id=db.Column(db.String(42),db.ForeignKey('variable.id'), primary_key=True)
        Type=db.Column(db.String)
        Source=db.Column(db.String)
    
        def __init__(self,Type,Source,id):
            self.Type=Type
            self.id=id
            self.Source=Source
    
    class StateVariable(db.Model):
        id=StateVariableType=db.Column(db.String)
        StateVariableValue=db.Column(db.String)
        id=db.Column(db.String(42),db.ForeignKey('contracts.address'),primary_key=True)
    
        
        def __init__(self,id,StateVariableType,StateVariableValue):
            self.StateVariableType=StateVariableType
            self.StateVariableValue=StateVariableValue
            self.id=id
           class Key(db.Model):
        id=db.Column(db.String(42),db.ForeignKey('m.id'), primary_key=True)
        Value=db.Column(db.String)
        Type=db.Column(db.String)
            
        def __init__(self,Value,id,Type):
            self.id=id
            self.Value=Value
            self.Type=Type
    
    
    
    class Analysis(db.Model): 
        id=db.Column(db.String(42),db.ForeignKey('contracts.address'),primary_key=True)
        FullTime=db.Column(db.DateTime)
        StateVariables=db.Column(db.Integer)
        
        def __init__(self,id,FullTime):
            self.id=id
            self.FullTime=FullTime
    
    
    @app.route('/') def index():
        return "Hello, World!" @app.route('/process', methods=['POST']) def process():
        #print ('h')
        header=request.json
        
        #print ('g')
        
        code=header['code']
        f=open('code.sol','w')
        f.write(code)
        f.close()
        path='./code.sol'   #filename
        subcon=header['name']   #name
        add=header['address']   #address
        contract=Contracts(subcon,add,path)
        db.session.add(contract)
        db.session.commit()
        lst=results(path,subcon,add)
        return jsonify({'task': lst})
    
    if __name__ == '__main__':
        app.run(debug=True)**

【问题讨论】:

  • “在 bash 视图中创建表”是什么意思?如果您在配置中将SQLALCHEMY_ECHO 设置为True,它是否显示CREATE TABLE 正在发出语句?运行应用程序时是否出现错误?你确定 pgadmin 正在查看正确的数据库吗?
  • 表已创建,我可以看到它们,但没有存储数据
  • 然后将一些打印语句添加到您的路由中,以查看您传递给Contracts 对象的变量的值。同样,将 SQLALCHEMY_ECHO 设置为 True 应该会显示正在发送到数据库的 SQL 语句。

标签: sql postgresql flask sqlalchemy flask-sqlalchemy


【解决方案1】:

我不确定您在上下文中使用 db.metadata.clear() 做什么。

很可能,您在数据库中看不到数据,因为您的代码中没有任何内容可以创建数据库关系。标准解决方案包括 Alembic(Flask-Migrate 包)或添加

with app.app_context():
    db.create_all()

到您的代码。 细节真的取决于你。 Flask-Migrate 非常简单:

  1. 安装:pip install flask-migrate
  2. 添加到模型:
from flask-migrate import Migrate
...
app = Flask(...)
...
#db init code
...
migrate = Migrate(app, db)
  1. 运行:

初始化:flask db init

迁移:flask db migrate -m "[YOUR MESSAGE]"

升级:flask db upgrade

除了官方文档之外,这里还有一个很好的来源:https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-iv-database

【讨论】:

  • 这是为了删除以前的表格。
  • 我得到了一个蒸馏表,但合同什么也没保存。我使用了从服务器导入 db 和 db.create_all()。对吗?
  • 我无法告诉您在我看不到的代码中什么是有效的或无效的。您应该使用 Flask-Migrate 或 db.create_all()。如果您使用后者,请确保您应用 with app.app_context(): 如果您使用的是 Flask-Migrate,您应该会在 flask db init 之后的项目目录中看到一个新的“迁移”文件夹。我希望您在运行应用程序时注释掉metadata.clear 命令。
  • 我已经在使用 db.create_all()。我会再试一次。
猜你喜欢
  • 1970-01-01
  • 2020-06-09
  • 2023-03-26
  • 2012-06-16
  • 2020-02-29
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多