如何强制 Flask/SQLAlchemy 创建表?

Posted

技术标签:

【中文标题】如何强制 Flask/SQLAlchemy 创建表?【英文标题】:How do I force Flask/SQLAlchemy to create a table? 【发布时间】:2014-10-15 20:15:54 【问题描述】:

我第一次将 Flask 与 flask.ext.sqlalchemy 一起使用。我收到一个错误,告诉我一个表不存在,但我认为对象关系设置会解决这个问题。可能不会。我在以下代码中缺少什么?

from flask import Flask, request, url_for
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.secret_key = 'This is really unique and secret'

db = SQLAlchemy(app)
app.config['SQLALCHEMY_DATABASE_URI'] ='mysql://golfape:mypass@mysql.server/golfape$swarm'


class Suggestion(db.Model):
    __tablename__ = 'suggestions'
    id   = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(100))

    def __init__( self, name ):
        self.name = name

@app.route('/')
def get_suggestion():
    return """
        <p>What do you think swarm prediction could be applied to?</p>
        <form method = "POST" action="%s">
             <input name="name" />
             <input type="submit" value="Go!" />
         </form>
         """ % (url_for('append_suggestion'),)


@app.route('/suggestions', methods=['POST'] )
def append_suggestion():
    name = request.form["name"]
    newSuggestion = Suggestion( name = name )
    db.session.add( newSuggestion )
    db.session.commit()
    return """
        <p>Thanks for suggesting %s</p>
        <p><a href="%s">Back</a></p>
        """ % (name, url_for('get_suggestion'))

这是错误:

默认错误处理程序中的文件“/usr/local/lib/python2.7/dist-packages/MySQLdb/connections.py”,第 36 行 引发错误类,错误值 ProgrammingError: (ProgrammingError) (1146, "Table 'golfape$swarm.suggestions' 不存在") 'INSERT INTOSuggestions (name) VALUES (%s)' ('fishing',)

【问题讨论】:

【参考方案1】:

您必须调用一次 db.create_all() 才能让 sqlalchemy 创建架构:

from my_app import Suggestion, db
db.create_all()

此外,您必须在初始化 db 之前移动数据库配置 URL 行:

app.config['SQLALCHEMY_DATABASE_URI'] ='mysql://golfape:mypass@mysql.server/golfape$swarm'
db = SQLAlchemy(app)

更新 上面提到的问题是关于连接到 mysql db 并为它找到合适的连接器。安装以下模块:

pip install pymysql

并像这样更改您的连接字符串:

db = SQLAlchemy('mysql+pymysql://user:password@mysql.server/database_name')

【讨论】:

谢谢。但是我得到这个错误。 ProgrammingError: (ProgrammingError) (1146, "Table 'golfape$swarm.suggestions' 不存在") 'INSERT INTOSuggestions (name) VALUES (%s)' ('really',) 嗨@GolfMonkey,检查我的答案的更新。我在笔记本电脑上尝试过,它可以无缝运行。这是我使用的原始答案的链接:***.com/a/22252975/157216 我认为如果无法安装 mysql,该解决方案会有所帮助。但在 www.pythonanywhere.com 上肯定不是这样。我可以很容易地连接到数据库。只是我看不到如何指示 SQLAlchemy 做什么。烦人的是我找不到关于这个主题的像样的教程(他们似乎都使用 SQLite)。 @GolfMonkey 在我的测试用例中,SQLAlchemy 在 mysql db 中创建了相应的表,没有错误。你的问题我已经不清楚了,你可以多解释一下你现在有哪些问题。

以上是关于如何强制 Flask/SQLAlchemy 创建表?的主要内容,如果未能解决你的问题,请参考以下文章

Flask-SQLAlchemy:如何有条件地插入或更新一行

Flask-SQLAlchemy 检查表中是不是存在行

Flask/SQLAlchemy - 多对多关系的关联模型和关联表之间的区别?

在添加Flask,SQLAlchemy之前检查表中的行中的值是不是已经存在

flask-离线脚本with在上下文的应用

FLASK SQLALCHEMY create_all() 不工作