如何在已连Server-2的Python Flask(SQLAlchemy)中使用Server-1的employee_info表?
在Flask-SQLAlchemy中使用第二台PostgreSQL服务器的现有表
这事儿其实很简单,SQLAlchemy(配合Flask-SQLAlchemy)天生支持多数据库绑定,你只需要给你的应用新增一个Server-1的连接配置,然后把对应表的模型绑定到这个连接上就行。具体步骤如下:
1. 添加第二台数据库的连接配置
首先在你的Flask应用配置里,新增Server-1的数据库连接信息,用SQLALCHEMY_BINDS来定义多数据库绑定:
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 你原来的Server-2连接(默认连接) app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://server2_user:server2_pass@server2_host:5432/server2_db' # 新增Server-1的连接,给它起个标识名(比如'server1') app.config['SQLALCHEMY_BINDS'] = { 'server1': 'postgresql://server1_user:server1_pass@server1_host:5432/server1_db' } # 关闭不必要的修改追踪,提升性能 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 初始化SQLAlchemy db = SQLAlchemy(app)
2. 映射Server-1上的employee_info表
接下来定义一个模型类,把它绑定到Server-1的连接上,并且指定要映射的现有表名。注意字段必须和Server-1上的employee_info表完全匹配(包括字段名、数据类型、约束):
class EmployeeInfo(db.Model): # 指定使用server1的连接 __bind_key__ = 'server1' # 指定要映射的表名(必须和Server-1上的表名一致) __tablename__ = 'employee_info' # 下面的字段根据你Server-1上employee_info表的实际结构来写 id = db.Column(db.Integer, primary_key=True) employee_name = db.Column(db.String(100)) # 假设表中有这个字段 department = db.Column(db.String(50)) hire_date = db.Column(db.Date) # 其他字段请按实际表结构补充
重要提醒:不要运行
db.create_all(bind='server1'),因为你的employee_info表已经在Server-1上存在了,执行这个命令可能会覆盖表或者报错。
3. 像使用普通模型一样操作employee_info表
现在你就可以像操作Server-2上的表一样,直接用这个模型进行查询、读取操作了:
# 查询所有员工信息 all_employees = EmployeeInfo.query.all() # 按部门筛选员工 engineering_employees = EmployeeInfo.query.filter_by(department='Engineering').all() # 获取单个员工 employee = EmployeeInfo.query.get(123)
如果需要执行原生SQL,也可以指定使用Server-1的连接引擎:
# 执行原生查询 result = db.session.execute( 'SELECT employee_name, hire_date FROM employee_info WHERE department = :dept', {'dept': 'HR'}, bind=db.get_engine(app, 'server1') ) # 提取结果 hr_employees = result.fetchall()
额外注意事项
- 确保你用来连接Server-1的数据库账号至少拥有
SELECT权限(如果需要写入的话还要有INSERT/UPDATE/DELETE权限) - 字段定义一定要和Server-1上的表完全匹配,否则会出现映射错误或者查询异常
- 如果你的Flask-SQLAlchemy版本是2.x以上,写法和上面一致,没有兼容性问题
内容的提问来源于stack exchange,提问作者kumkum kumkum
相关产品推荐
相关产品推荐

