簡體   English   中英

將Flask models.py遷移到MySQL

[英]Migrate Flask models.py to MySQL

我是新來的。 忍受我。

我正在使用SQLAlchemy作為ORM開發Flask應用程序,直到今天我一直在使用SQLite以方便使用。 我現在正在將應用程序放在Digital Ocean上,並希望使用MySQL而不是SQLite。

我在數字海洋上的ubuntu VPS上安裝了MySQL,看起來配置正確。 但是,顯然我必須創建數據庫表,所以我可以保存數據。

問題:我有沒有辦法遷移models.py,所以數據庫表是根據我在models.py中編寫的內容創建的,還是我必須自己在MySQL中手動創建所有數據庫表?

您可以在這里看到應用程序: http//workflowforum.dk/我已經做了一個小測試,看看這里是否有數據庫連接: http//workflowforum.dk/testdb

Models.py(僅限用戶模型):

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy 
from flask.ext.script import Manager
from flask.ext.migrate import Migrate, MigrateCommand
from datetime import datetime, date
from hashlib import md5
from bcrypt import hashpw, gensalt

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:password@localhost/database'
db = SQLAlchemy(app)

migrate = Migrate(app, db)

manager = Manager(app)
manager.add_command('db', MigrateCommand)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    slug = db.Column(db.String(80))
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(80))
    password = db.Column(db.String(80), unique=False)
    admin = db.Column(db.Boolean(), default=False)
    join_date = db.Column(db.DateTime)
    last_seen = db.Column(db.DateTime)
    topics = db.relationship('Topic')
    posts = db.relationship('Post')
    picture = db.Column(db.Boolean(), default=False)
    title = db.Column(db.String(80))
    company = db.Column(db.String(80))
    summary = db.Column(db.String(80))

class Category(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True)
    description = db.Column(db.String(180), unique=False)
    topics = db.relationship('Topic', backref="category")

class Topic(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    slug = db.Column(db.String(255), unique=True)
    title = db.Column(db.String(80), unique=False)
    description = db.Column(db.Text, unique=False)
    pub_date = db.Column(db.DateTime)
    last_update = db.Column(db.DateTime)
    user_id = db.Column(db.String(80), db.ForeignKey('user.id'))
    category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
    views = db.Column(db.Integer, default=0)
    locked = db.Column(db.Boolean(), default=False)
    pinned = db.Column(db.Boolean(), default=False)
    user = db.relationship('User')
    posts = db.relationship('Post')

Views.py(僅限數據庫測試):

@app.route('/testdb')
    def testdb():
    if db.session.query("1").from_statement("SELECT 1").all():
        return 'It works.'
    else:
        return 'Something is broken.'

盧卡斯評論后更新

在嘗試db.create_all()時,我得到了這個回溯:

sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (1005, "Can't create table 'pwforum.topic' (errno: 150)") [SQL: u'\nCREATE TABLE topic (\n\tid INTEGER NOT NULL AUTO_INCREMENT, \n\tslug VARCHAR(255), \n\ttitle VARCHAR(80), \n\tdescription TEXT, \n\tpub_date DATETIME, \n\tlast_update DATETIME, \n\tuser_id VARCHAR(80), \n\tcategory_id INTEGER, \n\tviews INTEGER, \n\tlocked BOOL, \n\tpinned BOOL, \n\tPRIMARY KEY (id), \n\tUNIQUE (slug), \n\tFOREIGN KEY(user_id) REFERENCES user (id), \n\tFOREIGN KEY(category_id) REFERENCES category (id), \n\tCHECK (locked IN (0, 1)), \n\tCHECK (pinned IN (0, 1))\n)\n\n']

注釋中的db.create_all建議通常是您不使用遷移框架時所執行的操作。 但看起來您在這里使用Flask-Migrate作為數據庫遷移框架。 執行create_all的問題是您的遷移腳本被跳過,因此您將sqlite模型轉換為MySQL所需的任何修復都不會反映在遷移腳本中。

我的建議是你創建一個空的MySQL數據庫,在Flask應用程序中配置它,然后只需調用以下命令就可以生成MySQL表:

$ ./manage.py db upgrade

執行此操作時,Flask-Migrate將按順序逐個開始運行遷移腳本。

如果您遇到故障,可能是因為您的某些遷移腳本的更改與sqlite兼容,但與MySQL不兼容。 您需要在遷移腳本中修復所有這些問題,直到您完全運行所有這些問題,此時您將擁有一個完整的MySQL數據庫以在您的應用程序中使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM