gpt4 book ai didi

python - 将 Flask models.py 迁移到 MySQL

转载 作者:可可西里 更新时间:2023-11-01 08:44:46 25 4
gpt4 key购买 nike

我是新来的。忍受我。

我正在开发一个使用 SQLAlchemy 作为 ORM 的 Flask 应用程序,直到今天我一直在使用 SQLite 以方便使用。我现在将应用程序放在 Digital Ocean 上并希望使用 MySQL 而不是 SQLite。

我在 Digital Ocean 上的 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.'

更新在 Lukas 评论之后:

当尝试 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 的任何修复都不会反射(reflect)在迁移脚本中。

我的建议是创建一个空的 MySQL 数据库,在 Flask 应用程序中对其进行配置,然后只需调用以下命令即可生成 MySQL 表:

$ ./manage.py db upgrade

执行此操作时,Flask-Migrate 将开始按顺序一个接一个地运行迁移脚本。

如果失败,那可能是因为您的某些迁移脚本具有与 sqlite 兼容但与 MySQL 不兼容的更改。您将需要修复迁移脚本中的所有这些问题,直到所有这些问题都能正常运行,此时您将拥有一个完整的 MySQL 数据库以用于您的应用程序。

关于python - 将 Flask models.py 迁移到 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31885286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com