Flask SQLALchemy 多个数据库连接如果实现

python flask SQLALchemy连接两个数据库怎么实现

要求,一个单独的文件配置一个数据库配置,共2个配置文件

在其他地方如何使用,执行SQL

该回答引用chatgpt:有不对的地方可以联系我,我在调整
可以通过在 Flask 应用中使用 SQLAlchemy 的 bind_key 参数,为每个数据库指定一个名称,然后在模型中使用这个名称指定模型对应的数据库连接。

以下是一个使用 Flask SQLAlchemy 连接两个数据库的示例:

首先,创建两个数据库配置文件,例如 config1.py 和 config2.py,分别定义两个数据库连接的相关配置,如下所示:

config1.py

SQLALCHEMY_DATABASE_URI = 'database_uri_for_db1'
SQLALCHEMY_TRACK_MODIFICATIONS = False


config2.py

SQLALCHEMY_DATABASE_URI = 'database_uri_for_db2'
SQLALCHEMY_TRACK_MODIFICATIONS = False


接着,在 Flask 应用的初始化中,可以通过加载这两个配置文件来创建两个数据库连接:


from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config.from_object('config1')
app.config.from_object('config2')

db1 = SQLAlchemy(app, bind_key='db1')
db2 = SQLAlchemy(app, bind_key='db2')

在上面的代码中,我们使用 bind_key 参数为每个数据库连接指定一个名称,这里分别为 db1 和 db2。

接下来,在模型中,可以通过设置 bind_key 属性来指定模型对应的数据库连接:

class User(db1.Model):
    __tablename__ = 'users'
    __bind_key__ = 'db1'

    id = db1.Column(db1.Integer, primary_key=True)
    name = db1.Column(db1.String(80))


class Order(db2.Model):
    __tablename__ = 'orders'
    __bind_key__ = 'db2'

    id = db2.Column(db2.Integer, primary_key=True)
    total_price = db2.Column(db2.Float)


在上面的代码中,User 模型对应的数据库连接为 db1,而 Order 模型对应的数据库连接为 db2。

最后,可以通过访问相应的数据库连接对象,执行 SQL 语句,例如:

# 访问 db1 连接对象,执行 SQL 查询
db1.session.execute('SELECT * FROM users')

# 访问 db2 连接对象,执行 SQL 查询
db2.session.execute('SELECT * FROM orders')
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7529860
  • 这篇博客你也可以参考下:Python--flask使用 SQLAlchemy查询数据库最近时间段或之前的数据
  • 您还可以看一下 郭宏志老师的Flask从入门到精通课程中的 Flask-SQLAlchemy 模型小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    可以在配置文件中配置多个数据库连接,每个连接可以使用不同的数据库类型和连接方式。配置文件的格式如下:

    SQLALCHEMY_BINDS = {
        'db1': 'sqlite:///db1.db',
        'db2': 'mysql+pymysql://user:password@host/db2'
    }
    

    其中,db1db2是自定义的标识符,表示两个不同的数据源,可以根据实际情况进行更改。sqlite:///db1.db是使用sqlite数据库方式连接到db1.db数据库文件。

    连接到多个不同的数据源后,在每个Model类中都需要指定使用的数据源。可以在Model类中使用__bind_key__属性来指定所属的数据源。例如:

    class User(db.Model):
        __tablename__ = 'users'
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(64))
        password = db.Column(db.String(64))
        __bind_key__ = 'db1'
    
    class Article(db.Model):
        __tablename__ = 'articles'
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(64))
        content = db.Column(db.Text)
        __bind_key__ = 'db2'
    

    在使用查询时,可以指定使用对应的数据源:

    users = User.query.filter_by(name='testuser').using_bind('db1').all()
    articles = Article.query.filter_by(title='test').using_bind('db2').all()
    

    最后,可以通过调用create_all方法来创建所有Model类对应的数据表。例如:

    with app.app_context():
        db.create_all(bind='db1')
        db.create_all(bind='db2')