我想使用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
的另一种方法。
答案 0 :(得分:0)
我发现此问题的唯一解决方法是执行以下操作:
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"""
这不是解决此问题的方法,而只是我所遵循的工作,但仍然不是很满意!