Подтвердить что ты не робот

Переключение с SQLite на MySQL с помощью Flask SQLAlchemy

У меня есть сайт, который я создал с помощью Flask SQLAlchemy и SQLite, и мне нужно переключиться на MySQL. Я сам переместил базу данных и запущен в MySQL, но

  • Невозможно выяснить, как подключиться к базе данных MySQL (то есть, что должно быть SQLALCHEMY_DATABASE_URI) и
  • Неясно, будет ли какой-либо из моего существующего SQLite-кода SQLAlchemy работать с MySQL.

Я подозреваю, что (1) довольно прост, и просто вопрос о том, как отображать, например, содержимое диалогового окна подключения, которое я использую в своем инструменте базы данных MySQL, для соответствующего отформатированного URL. Но я беспокоюсь о (2), я предположил, что SQLAlchemy предоставил уровень абстракции, чтобы простой код SQLAlchemy, например

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return '<User %r>' % self.username

admin = User('admin', '[email protected]')

db.session.add(admin)

User.query.all()

User.query.filter_by(username='admin').first()

wold работать без каких-либо изменений, кроме соответствующего изменения в URI базы данных; но примеры, которые я нашел для использования SQLAlchemy с MySQL, похоже, используют совершенно другой API.

Могу ли я (2) перенести свой код SQLAlchemy Flask для работы с базой данных MySQL, просто изменив URI базы данных и если да (1), что должен делать этот URI?

4b9b3361

Ответ 1

Указанный вами урок показывает правильный способ подключения к MySQL с помощью SQLAlchemy. Ниже приведен ваш код с очень небольшими изменениями:

Мои предположения - ваш сервер MySQL работает на том же компьютере, на котором запущена Flask, а имя базы данных - db_name. Если ваш сервер не такой же, поставьте IP-адрес сервера вместо localhost.

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:[email protected]/db_name'
db = SQLAlchemy(app)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return '<User %r>' % self.username

admin = User('admin', '[email protected]')

db.create_all() # In case user table doesn't exists already. Else remove it.    

db.session.add(admin)

db.session.commit() # This is needed to write the changes to database

User.query.all()

User.query.filter_by(username='admin').first()

Случилось так, что драйвер по умолчанию, используемый SQLAlchemy (mqsqldb), не компилируется для меня в моих виртуальных средах. Поэтому я выбрал драйвер MySQL с полной реализацией python pymysql. Как только вы установите его с помощью pip install pymysql, SQLALCHEMY_DATABASE_URI изменится на:

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:[email protected]/db_name'

Цель использования ORM, например SQLAlchemy, заключается в том, что вы можете использовать различные базы данных с небольшими изменениями или вообще без изменений в большинстве случаев. Итак, мой ответ - да. Вы должны иметь возможность использовать свой код sqlite для работы с MySQL с URI, отображаемым как в приведенном выше коде.

Ответ 2

Принятый ответ был верным в то время, но синтаксис в операторе импорта устарел.

Это:

from flask.ext.sqlalchemy import SQLAlchemy

Должен быть заменен на:

import flask_sqlalchemy

Поскольку вопросы, касающиеся соединений с базой данных, как правило, привлекают трафик и остаются актуальными в течение длительного времени, их стоит записать.

Устаревание находится в журнале изменений Flask версии 1.0, который фактически использует этот модуль в следующем примере:

flask.ext - импортировать расширения напрямую по их имени, а не через пространство имен flask.ext. Например, import flask.ext.sqlalchemy становится import flask_sqlalchemy.