首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用SQLite SQLAlchemy从SQLAlchemy切换到MySQL

用SQLite SQLAlchemy从SQLAlchemy切换到MySQL
EN

Stack Overflow用户
提问于 2015-01-04 14:59:22
回答 2查看 107.1K关注 0票数 80

我有一个用SQLAlchemy和SQLite构建的站点,需要切换到MySQL。我迁移了数据库本身并让它在MySQL下运行,但是

  1. 无法知道如何连接到MySQL数据库(即SQLALCHEMY_DATABASE_URI应该是什么)
  2. 我不清楚我现有的SQLAlchemy SQLite代码是否会与MySQL一起工作。

我怀疑(1)相当简单,只是演示了如何将我在MySQL数据库工具中使用的连接对话框的内容映射到适当格式化的URL。但是我担心(2),我曾经假设SQLAlchemy提供了一个抽象层,所以简单的SQLAlchemy代码,如

代码语言:javascript
复制
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', 'admin@example.com')

db.session.add(admin)

User.query.all()

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

除了对数据库URI进行适当的更改外,wold不进行任何修改;但是,使用我找到的例子与MySQL一起使用SQLAlchemy的API似乎使用了完全不同的API。

我能否(2)通过简单地更改数据库URI来迁移我的SQLAlchemy代码以处理MySQL数据库,如果是的话(1)这个URI应该是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-08 06:51:00

您所指出的教程展示了使用MySQL连接到SQLAlchemy的正确方法。下面是更改非常少的代码:

我的假设是,您的MySQL服务器正在运行的同一台机器上运行,数据库名为db_name。如果您的服务器不是同一台机器,请将服务器IP替换为localhost

代码语言:javascript
复制
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/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', 'admin@example.com')

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)使用的默认驱动程序在我的虚拟环境中并没有被编译。因此,我选择了一个具有完整python实现的MySQL驱动程序pymysql。使用pip install pymysql安装它后,SQLALCHEMY_DATABASE_URI将更改为:

代码语言:javascript
复制
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost/db_name'

像SQLAlchemy这样使用ORM的目的是,在大多数情况下,您可以使用不同的数据库,很少或没有变化。所以,我的回答是肯定的。您应该能够使用sqlite代码来使用MySQL,并将URI映射到上面的代码中。

票数 123
EN

Stack Overflow用户

发布于 2019-04-20 15:43:30

当时接受的答案是正确的,但导入语句中的语法已被废弃。

这是:

代码语言:javascript
复制
from flask.ext.sqlalchemy import SQLAlchemy

应改为:

代码语言:javascript
复制
import flask_sqlalchemy

由于有关数据库连接的问题往往会获得通信量并在很长一段时间内保持相关性,因此值得记录在案。

反对意见出现在瓶装1.0版变更版中,它在示例中实际使用了该模块:

flask.ext -通过名称直接导入扩展,而不是通过flask.ext命名空间导入扩展。例如,导入flask.ext.sqlalchemy变成导入flask_sqlalchemy。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27766794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档