【问题标题】:How to properly select duplicate field names in a raw JOIN query in SQLAlchemy如何在 SQLAlchemy 的原始 JOIN 查询中正确选择重复的字段名称
【发布时间】:2019-11-13 11:51:48
【问题描述】:

我想在 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.idc.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 的方法。

【问题讨论】:

  • 虽然不是您真正想要的答案,但通常在交互式一次性查询中使用 * 有点不受欢迎,因为它将您的实现与桌子。

标签: python sqlalchemy flask-sqlalchemy


【解决方案1】:

我发现解决此问题的唯一方法是执行以下操作:

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"""

这不是解决此问题的方法,而只是我遵循的解决方法,但仍然不太满意!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2017-04-03
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2022-07-14
    • 1970-01-01
    相关资源
    最近更新 更多