【发布时间】:2018-10-23 11:43:05
【问题描述】:
在我问这个问题之前,我承认这是一个奇怪的问题。 我想知道是否可以使用原始 SQL 而不是使用方法本身来复制 Flask / SQL Alchemy 类方法?
长话短说,我和我的队友正在学习数据库设计课程,我们现在正处于实施阶段,我们正在编写基于我们的数据库架构设计的应用程序。我们想让事情变得简单,所以我们选择在 Python 中使用 Flask。我们正在关注Flask Mega Tutorial,这是一个kickass-tic 教程,解释了如何像我们一样构建一个基本站点。我们刚刚完成了第 5 章:用户登录,并且正在继续。
在app/routes.py 脚本中,教程做了一些事情来获取用户信息。这是示例应用程序的示例登录路径:
from flask_login import current_user, login_user
from app.models import User
# ...
@app.route('/login', methods=['GET', 'POST'])
def login():
if current_user.is_authenticated:
return redirect(url_for('index'))
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.username.data).first()
if user is None or not user.check_password(form.password.data):
flash('Invalid username or password')
return redirect(url_for('login'))
login_user(user, remember=form.remember_me.data)
return redirect(url_for('index'))
return render_template('login.html', title='Sign In', form=form)
user = User.query.filter_by(username=form.username.data).first() 行是我感兴趣的。基本上,该行实例化了User 类,这是来自 SQL Alchemy 的数据库模型,并从用户输入的电子邮件地址中获取有关用户的信息。调用这些方法会生成如下 SQL 语句:
SELECT `User`.`userID` AS `User_userID`,
`User`.user_email AS `User_user_email`,
`User`.user_first_name AS `User_user_first_name`,
`User`.user_last_name AS `User_user_last_name`,
`User`.user_password AS `User_user_password`
FROM `User`
WHERE `User`.user_email = 'test@test.com'
LIMIT 1
还有一些关于user 变量本身的信息:
>>> print(type(user))
<class 'myapp.models.User'>
>>> pp(user.__dict__)
{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x7f5a026a8438>,
'userID': 1,
'user_email': 'test@test.com',
'user_first_name': 'SomeFirstName',
'user_last_name': 'SomeLastName',
'user_password': 'somepassword'}
在我们的项目中,我们不应该使用生成的 SQL 语句,例如在实例化的 User 类上调用 query.filter_by(username=form.username.data).first() 产生的 SQL 语句;我们应该自己编写原始 SQL,这通常没有意义,但在我们的例子中确实如此。
这可能吗?
【问题讨论】:
-
但在我们的例子中确实如此。:为什么它有意义?是的,您可以执行原始查询。然后,您可以根据数据创建自己的
User实例。但是您为什么要这样做? -
请注意,
User.query.filter_by(username=form.username.data).first()发出一个非常非常简单的SELECT查询,带有LIMIT 1。使用手动“手工”查询不会改善该查询。 SQLAlchemy 所做的一切都是可自省和可调整的,您可以使用 core API 构建相同的查询,或者只是将原始 SQL 传递给数据库连接。但这 a) 会增加开发成本,并且 b) 如果您不小心处理不受信任的数据,则会给您带来安全问题。 -
@MartijnPieters 哈,我告诉过你这很奇怪:D。通常你不会那样做,我知道这一点。我担心该项目的评分者会使用自动生成 SQL 查询的类方法严厉地看待我们,无论多么简单。
-
然后去和你的教授或助教谈谈,看看真正的要求是什么。如果您应该编写自己的 SQL,那么不要使用 SQLAlchemy 开始。
-
@ScottCrooks:那么也许您需要寻找不同的教程。 Mega 教程正在教授最佳实践,但如果这些不符合您的课程要求,请查找其他内容。您在询问是否可以绕过专门为您处理 SQL 的工具而不为您处理 SQL。是的,它可以,但是为什么要使用该工具开始呢?
标签: python flask sqlalchemy flask-sqlalchemy