Ошибка с «Ошибка NoneType» с SQLAlchemy: - PullRequest
0 голосов
/ 26 ноября 2018

Я новичок во Фляске.Я создал sqlite базу данных , определенную моим models.py , и я заполнил ее значениями .Я хотел напечатать все, что есть во внутренней таблице базы данных: line_info , используя файл search_var.html.Однако я получаю сообщение об ошибке. Пожалуйста, помогите

My models.py

from app  import db
class line_info(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    EUSOL_id = db.Column(db.VARCHAR (255), nullable=True)
    acc_id = db.Column(db.VARCHAR (255), nullable=True)
    acc_name=db.Column(db.String(20), nullable=True)
    reasons = db.Column(db.String(100), nullable=True)
    genbank = db.Column(db.String(100), nullable=True)

    def __init__(self, EUSOL_id,acc_id,acc_name,reasons,genbank):
        self.EUSOL_id= EUSOL_id
        self.acc_id = acc_id
        self.acc_name = acc_name
        self.reasons = reasons
        self.genbank = genbank

Я добавил несколько фиктивных значений из оболочки Python для проверки:

from app import db, app
from app.models import line_info

l = line_info(EUSOL_id='abcdeg', acc_id='asgd', acc_name='tomato_name', reasons='wild', genbank='NA')
db.app = app
db.init_app(app)
db.create_all()
db.session.add(l)
db.session.commit() 
line_info.query.all()
[<line_info 1>]

Мой rout.py

from flask import render_template
from app import app

@app.route('/')
def search_func():
    line_info = None
    line_info = line_info.query.all()
    return render_template("search_var.html", line_info=line_info)

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

Мой 'search_var.html'

{% extends "layout.html" %}
{% block title %}Search{% endblock %}
{% block main %}

   <h1>Lines</h1>
    {% for line in line_info %}
      <p>{{line_info.id}}</p>
    {% endfor %}

{% endfor %}

Ошибка:

Traceback (most recent call last):
  File "/home/workstation1/flask_beta/my_venv/lib/python3.6/site-packages     /flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/workstation1/flask_beta/my_venv/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/workstation1/flask_beta/my_venv/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/workstation1/flask_beta/my_venv/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/home/workstation1/flask_beta/my_venv/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/workstation1/flask_beta/my_venv/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/workstation1/flask_beta/app/routes.py", line 9, in search_func
    line_info = line_info.query.all()
AttributeError: 'NoneType' object has no attribute 'query'

Мое дерево каталогов

/flask_beta
|__/app
|     |__models.py
|     |__routes.py
|     |__/templates
|                |__search_var.html
|__app.db
|__run.py
|__config.py

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Вы не можете назвать свою модель line_info, затем используйте это же имя для списка экземпляров.line_info теперь является локальной переменной, она также не может быть глобальным именем, поэтому вы получаете исключение UnboundLocalError при удалении строки line_info = None.

Используйте другоеимя для результата line_info.query.all().Вам сначала не нужно ничего устанавливать на None:

from flask import render_template
from app import app
from model import line_info

@app.route('/')
def search_func():
    lines = Line_info.query.all()
    return render_template("search_var.html", line_info=lines)

Вы все равно можете использовать line_info в шаблоне, хотя это тоже не рекомендуется.

Вместо этого я рекомендуювы переименовываете свою модель в соответствии с Соглашениями об именах Python ;Используйте CamelCase, с заглавными буквами, без _ подчеркиваний:

class LineInfo(db.Model):
    # ...

Теперь намного проще отличить от локальных переменных.

0 голосов
/ 26 ноября 2018

Это из-за инициализации line_info значением None вместо импорта его из файла моделей.

Я надеюсь, что следующий код будет работать.

from flask import render_template
from app import app 

from models import Line_info

@app.route('/')
def search_func():
    line_info = Line_info.query.all()
    return render_template("search_var.html", line_info=line_info)

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