首页 > flask-sqlachemy使用mysql,出现错误Internal Error

flask-sqlachemy使用mysql,出现错误Internal Error

最近在学习Flask Web开发这本书
用flask-sqlachemy连接到mysql的时候,参考书中提供的URI,把sqlite的改成了mysql的
这是config文件

import os

class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
    FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:7123@localhost/database'
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True

    @staticmethod
    def init_app(app):
        pass

config = Config()请输入代码

这是__init__文件

from flask import Flask
from flask.ext.bootstrap import Bootstrap
from flask.ext.moment import Moment
from flask.ext.sqlalchemy import SQLAlchemy
from config import config
from flask.ext.login import LoginManager
from flask.ext.pagedown import PageDown
import pymysql

pymysql.install_as_MySQLdb()
bootstrap = Bootstrap()
moment = Moment()
db = SQLAlchemy()
pagedown = PageDown()

login_manager = LoginManager()
login_manager.session_protection = 'strong'
login_manager.login_view = 'auth.login'


def create_app(config):
    app = Flask(__name__)
    app.config.from_object(config)
    config.init_app(app)

    bootstrap.init_app(app)
    moment.init_app(app)
    db.init_app(app)
    login_manager.init_app(app)
    pagedown.init_app(app)

    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    from .auth import auth as auth_blueprint
    app.register_blueprint(auth_blueprint, url_prefix='/auth')

    return app

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

这是启动文件manage

#!/usr/bin/env python
import os
from app import create_app, db
from app.models import User, Role
from flask.ext.script import Manager, Shell
from flask.ext.migrate import Migrate, MigrateCommand
from config import config
from flask.ext.sqlalchemy import SQLAlchemy


app = create_app(config)
manager = Manager(app)
migrate = Migrate(app, db)


def make_shell_context():
    return dict(app=app, db=db, User=User, Role=Role)
manager.add_command("shell", Shell(make_context=make_shell_context))
manager.add_command('db', MigrateCommand)


@manager.command
def test():
    """Run the unit tests."""
    import unittest
    tests = unittest.TestLoader().discover('tests')
    unittest.TextTestRunner(verbosity=2).run(tests)


if __name__ == '__main__':
    manager.run()

在使用python manage.py shell后,使用db.create_all()
抛出错误

raise InternalError(errno, errorvalue)
sqlalchemy.exc.InternalError: (InternalError) (1049, "Unknown database 'database'") None None

找了半天,开始的时候就是直接改的config里的SQLALCHEMY_DATABASE_URI,会出现ImportError: No module named 'MySQLdb',我想是因为没有跟MySQL接起来,按照https://www.zhihu.com/question/29719547这个帖子里面讲的,用了个pymysql来做,结果就是上面那个样子,求教求教
查了挺多资料,似乎还有另外一条路子,就是放弃ORM,用sql语句查询,用engine建立数据库连接?
谢谢~


额,这个错误貌似是没有数据库。


我之前也遇到了同样的问题,现在分享一下。
首先,sqlalchemy链接MySQL需要MySQLdb进行连接,这个库一般用pip或者easy_install是装不上的,需要很多依赖。

linux:

sudo apt-get install python-mysqldb(ubuntu)
yum install MySQL-python (Linux Fedora, CentOS ...)

windows:

需安装 MySQL-python
链接在这https://pypi.python.org/pypi/MySQL-python/1.2.5

安装好以后打开python,import MySQL看看会不会报错,如果不会,那就装好了。


问题搞定了,首先是想用MySQL,必须要用到PyMySQL或者是@island所讲的,MySQLdb,MySQLdb对python的支持有点问题,楼上答案的链接支持到py2.7,我记得看过一个资料讲,这个支持是到py3.4,py3.5就不行了,这个我没有尝试过,遇到困难的小伙伴可以回头试试PyMySQL,记得import pymysql和pymysql.install_as_MySQLdb()两句,URI也要相应的变化
然后,如@NSDont所讲,create_all()只是能建表而已,还需要自己用MySQL撸一个数据库(数据库的名字也不能傻傻的叫DATABASE)。
最后那个URI里面,如果是本地数据库,server通常是localhost:3306,注意一下这个地方
头一次提问,谢谢楼上二位~

【热门文章】
【热门文章】