多个数据库连接如果实现

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

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

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

可以通过在 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')
```bash


```

定义两个数据库配置文件,

  • config1.py
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://user1:password1@host1/db1'
  • config2.py
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://user2:password2@host2/db2' 

在 Flask 初始化文件中加载两个配置,例如:

app = Flask(__name__)
app.config.from_pyfile('config1.py')
app.config.from_pyfile('config2.py')

定义两个 SQLAlchemy 的 Session 对象,并绑定两个配置:

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker

engine1 = create_engine(app.config['SQLALCHEMY_DATABASE_URI1'], echo=True)
engine2 = create_engine(app.config['SQLALCHEMY_DATABASE_URI2'], echo=True)

db1 = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine1))
db2 = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine2))

执行 SQL 时,指定使用哪个 Session:

# 使用 db1
result = db1.execute('SELECT * FROM table1;') 

# 使用 db2 
result = db2.execute('SELECT * FROM table2;')

对模型类应用同样的 Session:

from sqlalchemy.ext.declarative import declarative_base

Base1 = declarative_base()
Base2 = declarative_base()

class Table1(Base1):
    __tablename__ = 'table1'
    # ...

class Table2(Base2):
    __tablename__ = 'table2'
    # ... 

Table1.query = db1.query_property()
Table2.query = db2.query_property()

对两个数据库的表进行查询

Table1.query.all()
Table2.query.filter_by(id=1).first()

望采纳!

如果你真看懂框架里的连接到底是怎么配的,而不是只会用别人写好的代码
那再照猫画虎加一个不就行了