【问题标题】:My python file can't identify my sqlite's table even when I imported it即使我导入了我的 python 文件也无法识别我的 sqlite 表
【发布时间】:2020-05-17 21:33:47
【问题描述】:

我从“data.sqlite”的数据库中查询数据,运行我的项目并得到 “sqlite3.OperationalError: no such table: blog_post”。如果您能帮我解决这个错误,那就太好了。谢谢!

我在models.py中创建了一个名为“BlogPost”的表,它的表名是“blog_post”:

class BlogPost(db.Model):
    __tablename__ = 'blog_post'
    users = db.relationship(User)

    blog_id = db.Column(db.Integer, primary_key=True)

    user_id = db.Column(db.Integer,db.ForeignKey('users.id'), nullable=False) 
    date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)  #
    problem_name = db.Column(db.String(140), nullable=False)
    text = db.Column(db.Text, nullable=False)
    blog_image = db.Column(db.String(140), nullable=False, server_default='default_blog.jpg')


    def __init__(self, text, problem_name, user_id, blog_image):
        self.text = text
        self.problem_name = problem_name
        self.user_id = user_id
        self.blog_image = blog_image



    def __repr__(self):
        return f"Post ID: {self.post_id} -- Date:{self.date}---{self.problem_name}"


使用查询控制台,我检查并看到这个表存储数据很好,我可以看到没有错误。

我想从该表中查询数据并将其显示到我网页上的 HTML 文件中,因此我使用命令“myproject.models import BlogPost”将其导入名为“views.py”的 Python 文件(我的 Pycharm IDE显示命令运行正常且没有错误)

然后我在下面有这些代码:

from flask import render_template, request, Blueprint
import _sqlite3
...some other import

init_db()

conn = _sqlite3.connect('data.sqlite', check_same_thread=False)
c = conn.cursor()
core = Blueprint('core', __name__)

@core.route('/', methods=['GET', 'POST'])
def index():
    search = Blogsearch_form(request.form)
    if request.method == 'POST':
        c.execute("SELECT * FROM blog_post WHERE problem_name LIKE (?)", ('%' + str(search) + '%',))
        results = c.fetchall()
        return render_template('blog_search_result.html', results=results)


我的data.sqlite数据库图片:

我在控制台中查询查看表 blog_post,它发现表名为 blog_post。它还显示了我在网站中输入的所有数据:

顺便说一句,这是我用来在项目的 init.py 中创建“data.sqlite”数据库的代码之一:

basedir = os.path.abspath(os.path.dirname(__file__))
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir,
                                                                    'data.sqlite') 
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False


【问题讨论】:

    标签: python sqlite


    【解决方案1】:

    当您提出请求时,您可以从表格中进行。

    你的命令是:

    c.execute("SELECT * FROM BlogPost WHERE problem_name LIKE (?)", ('%' + str(search) + '%',))
    

    您的表名似乎是“blog_post”,而不是您请求中的“BlogPost”。

    我没有您的代码的全貌,因此您可以尝试提供反馈。

    您可以使用类似这样的 format() 命令编写代码来访问模型中的表名设计。

    c.execute("SELECT * FROM {0} WHERE problem_name LIKE {1}".format(tablename, '%' + str(search) + '%')))
    

    (tablename 代表您在模型中用于创建的表名)

    好像问题似乎与路径代码试图访问数据库有关:

    1/ 知道当前目录放在这里 print(os.getcwd()) 命令:

    if request.method == 'POST':
        print("current working path : ", os.getcwd())
        c.execute("SELECT * FROM blog_post WHERE problem_name LIKE (?)", ('%' + str(search) + '%',))
    

    2/ 测试连接是否与真实的 rPath = '.../database'

    conn = _sqlite3.connect(rPath, check_same_thread=False)
    

    【讨论】:

    • 嗨劳伦特!感谢你们对我的帮助!我试过 c.execute("SELECT * FROM blog_post", ('%' + str(search) + '%',)) 但它仍然给出同样的错误: sqlite3.OperationalError: no such table: blog_post (或 BlogPost当我在 c 中更改为 BlogPost 时执行)
    • 您好,认识您,您可以用软件编辑您创建的sqlite db,以识别创建后的表的真实名称吗?然后你把“real_name”放在格式命令中看看发生了什么
    • 嗨劳伦特!真的很感谢你在帮助我。我不认为这是导致错误的表名,因为我的“data.sqlite”数据库的控制台仍然可以识别表“blog_post”并查询数据供我查看....(我刚刚编辑并添加了一张在我的帖子中显示的图片)
    • 好吧,如果它已经在其他地方编辑过,也许是对数据库的访问?使用前应确保免费访问
    • 我没有对数据库进行任何编辑。我创建了名为“data.sqlite”的数据库,并在我的项目文件夹中将其名称显示为“data.sqlite”。我只是放了一张新图,可以帮助你更多地了解我的“data.sqlite”数据库。
    【解决方案2】:

    我刚刚解决了这个问题!非常感谢 Laurent(在上面评论)对我的帮助!

    所以我只是将 data.sqlite 文件移到了外面,在最大的文件夹中。错误是因为我在导入命令中写错了路径;)

    但他或她的代码也有效,所以请检查一下!

    现在它可以很好地识别表了:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-27
      • 2023-03-09
      • 2021-06-10
      • 2022-07-06
      • 2021-06-26
      • 1970-01-01
      • 2017-10-21
      • 2023-04-04
      相关资源
      最近更新 更多