python - 如何在 SQLAlchemy 的原始 JOIN 查询中正确选择重复的字段名称
问题描述
我想在 SQLAlchcemy 中使用 Connection.execute() 运行原始 MySQL JOIN 查询。但是,我无法获取具有相同名称的任何两个字段/列的数据。
我的模型:
class Client(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement= True)
client_name = db.Column(db.String(80), nullable=False)
email = db.Column(db.String(120), nullable=False)
class User(db.Model):
__table_args__ = {'mysql_engine': 'InnoDB', 'mysql_charset': 'utf8', 'mysql_collate': 'utf8_general_ci'}
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(80), nullable=False)
email = db.Column(db.String(120), nullable=False)
client_id = db.Column('client_id', db.Integer, nullable=True, index=True)
正如您在两个模型中看到的那样,我有一个名为id
然后我有这个功能
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://my_user:password@localhost/my_db'
db = SQLAlchemy(app)
conn = db.engine.connect()
sql_statement = """SELECT * FROM User u JOIN Client c ON u.client_id = c.id"""
info = conn.execute(sql_statement)
for row in info:
print(row)
row = dict(row)
print(row)
当我遍历执行结果时,我希望返回包含两个字段的记录u.id
,c.id
但是我只得到一个名称为 id 的字段(甚至不是 u.id 或 c.id)。
我都试过了SELECT u.*, c.*
,SELECT u.id , c.id
但没有奏效。
第一次打印(在转换为 dict 之前)打印具有两个 id 的所有字段的值,但在我将其转换为 dict 后它不再工作,在我的用例中,我必须将其转换为 dict。
如何在不必AS
在查询中使用的情况下获得预期的行为?
注意:如果我使用SELECT u.* AS u_id, c.id AS c_id
它可以正常工作,但我正在寻找另一种不使用AS
.
解决方案
我为这个问题找到的唯一解决方法是执行以下操作:
sql_statement = """SELECT u.id AS `u.id`, c.id AS `c.id` FROM User u JOIN Client c ON u.client_id = c.id"""
这不是解决此问题的方法,而只是我遵循的解决方法,但仍然不太满意!
推荐阅读
- sql - 消除与 SQL Server 中原始表交换后变得相同的行
- c# - 使用 .net core Entity Framework 从 JSON 创建嵌套数据
- xslt - XSLT 副本不包括属性
- java - 严重:无法将数据库状态与会话同步
- c# - 来自对 webform localhost 中 webmethods 的 AJAX 调用的未知 web 方法错误
- r - 当前一个值不是 1 时,用前一个值代替当前值,直到在 R 中找到下一个非 1 值
- c# - 如何在运行时使用 MenuItems 动态填充 MenuItem?
- python - 使用 uproot 继续读取压缩问题的树数据
- java - Connection 拒绝从 docker 连接到 Elasticsearch docker 容器
- kubernetes - 普罗米修斯警报管理器配置未显示在 UI 中