我有一个原始的 sql 查询,它是:
select distinct(user_id) from details_table where event_id in (29,10) and user_id in (7,11,24,45) and epoch_timestamp >= 1433116800 and epoch_timestamp <= 1506816000;
Run Code Online (Sandbox Code Playgroud)
这在psql收益:
user_id
---------
7
24
(2 rows)
Run Code Online (Sandbox Code Playgroud)
现在,当我通过 sqlalchemy 运行这个原始 sql 查询时,我得到了一个sqlalchemy.engine.result.ResultProxy对象作为响应,而不是上面的结果。我现在使用的代码如下:
from flask import current_app
sql_query = text(select distinct(user_id) from details_table where event_id in (29,10) and user_id in (7,24) and epoch_timestamp >= 1433116800 and epoch_timestamp <= 1506816000;)
filtering_users = db.get_engine(current_app, bind='<my_binding>')\
.execute(sql_query)
print(type(filtering_users))
# <class 'sqlalchemy.engine.result.ResultProxy'>
print(filtering_users)
# <sqlalchemy.engine.result.ResultProxy object at 0x7fde74469550> …Run Code Online (Sandbox Code Playgroud) 我试图在一个属性的表中获取最大值,该属性是风险:
我在跑步:
func.max(HostsModel.risk)
Run Code Online (Sandbox Code Playgroud)
我回来了:
<sqlalchemy.sql.functions.max at 0x10f0721d0; max>
Run Code Online (Sandbox Code Playgroud)
我如何真正从中获得价值?
我将这些视为可用功能:
dir(func.max(HostsModel.risk))
['__add__', '__and__', '__bool__', '__class__', '__contains__', '__delattr__', '__dict__', '__dir__', '__div__', '__doc__', '__eq__', '__format__', '__ge__', '__getattr__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__module__', '__mul__', '__ne__', '__neg__', '__new__', '__nonzero__', '__or__', '__radd__', '__rdiv__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__rshift__', '__rsub__', '__rtruediv__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__visit_name__', '__weakref__', '_allow_label_resolve', '_alt_names', '_annotate', '_annotations', '_bind', '_bind_param', '_clone', '_cloned_set', '_cols_populated', '_compare_name_for_result', '_compiler', '_compiler_dispatch', '_constructor', '_copy_internals', '_deannotate', '_execute_on_connection', '_execution_options', …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Flask 应用程序中使用 pymysql 和 Flask-sqlalchemy 配置一个 mysql 数据库。
db = SQLAlchemy()
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:password@localhost:3306/ftm'
db.init_app(app)
Run Code Online (Sandbox Code Playgroud)
但是,当我运行我的应用程序时,我得到:
OperationalError: (pymysql.err.OperationalError) (1045, u"Access denied for user 'root'@'localhost' (using password: NO)")
Run Code Online (Sandbox Code Playgroud)
我尝试重置密码,并验证它是否有效:从命令行,我可以通过以下方式输入 mysql:
mysql -u root -p
Run Code Online (Sandbox Code Playgroud)
然后在提示下输入我的密码。有没有人知道为什么 mysql 似乎认为我试图在没有密码的情况下进行连接,即使我在 URI 中有一个(有效的)密码?
请注意,这是与mysql_exceptions.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: YES)")和其他潜在重复项不同的问题,因为这些错误消息至少注册了连接尝试附有密码。
编辑:在任何特定的顺序,我:尝试不同的用户,检查连接字符串的状态立即db.init_app之前,创造了MySQL的不同实例,并试图连接到它,去除pymysql从连接字符串,并试图回用 pdb 跟踪它(没用,因为我认为我自己的唯一方法调用是 init_app())。我还搜索了互联网,没有发现任何人在尝试使用密码连接到数据库时收到此错误消息。我能想到的唯一剩下的可能性是在从 app.config 传递到 mysql(当我调用 db.init_app 时)时,某些东西正在更改我的字符串以删除密码。有任何想法吗?如果没有人,我只需要使用 Postgre 或其他什么......
在我的Signedup路线中,我试图将用户 ID 存储在会话中并自动登录用户,但是当我尝试这样做时,我收到此错误:
TypeError: object of type 'ResultProxy' does not support indexing
而且,在我的signin路线中,我试图记住哪个用户已登录,但在这里出现错误:
TypeError: object of type 'ResultProxy' has no len()
signedup 路线 application.py
@app.route("/signedup",methods=["GET","POST"])
def signedup():
if request.method=="POST":
password = request.form.get("password")
hash = pwd_context.encrypt(password)
name = request.form.get("name")
if not name:
return "must provide username"
elif not password:
return "must provide password"
registration = db.execute("INSERT INTO users (username,password) VALUES (:username,:password)",
{"username":name,"password":hash})
if not registration:
return "pick a different username"
# Store their ID in session and …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用flask-wtf和wtforms-alchemy 在此表单上创建注册表单我尝试创建selectfield,其值是从我的模型中查询的。但我总是收到这个错误:
ValueError: too many values to unpack (expected 2)
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
from flask_wtf import FlaskForm
from wtforms_sqlalchemy.fields import QuerySelectField
def choose_domicile():
return Domicile.query
class RegisterForm(FlaskForm):
name = StringField('Name', validators=[DataRequired()])
domicile = QuerySelectField(u'Domicile', query_factory=choose_domicile)
@app.route('/signup', methods=['GET', 'POST'])
def signup():
form = RegisterFormView()
try:
if form.validate_on_submit():
new_user = Data(name=form.name.data, domicile=form.domicile.data)
db.session.add(new_user)
db.session.commit()
return "Success"
except:
return "Failed"
return render_template('signup.html', form=form)
Run Code Online (Sandbox Code Playgroud)
这是我的signup.html:
{% block content %}
<div class="container">
<form class="form-signin" method="POST" action="/signup">
<h2 class="form-signin-heading">Sign Up</h2>
{{ …Run Code Online (Sandbox Code Playgroud) 我已经阅读了许多其他关于将模型与主应用程序分离的帖子,但我无法让它仅与 app.py(我的实际应用程序)和 models.py(我的数据库模型)一起使用。
如果我执行以下操作,我会得到一个没有表的 app.db 文件:
from app import db
db.create_all()
Run Code Online (Sandbox Code Playgroud)
如果我执行以下操作,我会收到 RuntimeError: No application found。在视图函数中工作或推送应用程序上下文。:
from app import db
db.create_all()
Run Code Online (Sandbox Code Playgroud)
我还查看了上下文介绍页面,但无法弄清楚我将 def create_app(): 放在哪里,在我的情况下,它似乎都不起作用。
这是我的 app.py:
from flask import Flask, render_template, request
from flask_sqlalchemy import SQLAlchemy
from models import userTable
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
@app.route('/', methods=['GET', 'POST'])
def home():
return "home"
if __name__ == '__main__':
app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)
这是我的models.py:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class userTable(db.Model):
__tablename__ = "userTable" …Run Code Online (Sandbox Code Playgroud) 我正在尝试借助 SQLAlchemy、Marshmallow 和 flask-restplus 使用单个表构建简单的 REST API。但它给出了 LookupError。
应用程序使用过程中出现以下错误:
File "/home/ec2-user/.local/lib/python2.7/site-packages/sqlalchemy/dialects/mysql/enumerated.py", line 147, in _object_value_for_elem
return super(ENUM, self)._object_value_for_elem(elem)
File "/home/ec2-user/.local/lib/python2.7/site-packages/sqlalchemy/sql/sqltypes.py", line 1483, in _object_value_for_elem
'"%s" is not among the defined enum values' % elem
LookupError: "DIVERSE" is not among the defined enum values
96.57.148.186 - - [27/Feb/2019 09:16:23] "GET /employee/114425 HTTP/1.1" 500 -
Run Code Online (Sandbox Code Playgroud)
我正在尝试将 Enums 与 Marshmallow 和 SQLAlchemy 一起使用。我应该放弃 Enums 并简单地在数据库中使用 String 字段并仅对 Marshmallow 进行验证吗?
service.py文件是:
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow …Run Code Online (Sandbox Code Playgroud) python sqlalchemy flask-sqlalchemy flask-restplus marshmallow
我想评估链接到两个不同用户的值。我创建了一个不同的表来跟踪用户以前的体验和他们感兴趣的体验,并将它们与用户联系起来。我有一个匹配函数试图找到最相似的用户,但它给出了标题中列出的属性错误。
模型:
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
prev = db.relationship('prevExp', backref='user', lazy='dynamic')
interested = db.relationship('interestedExp', backref='user',
lazy='dynamic')
matches = db.relationship('Match', backref='matchedTo', lazy='dynamic')
class prevExp(db.Model):
id = db.Column(db.Integer, primary_key=True)
arts = db.Column(db.String(1))
consulting = db.Column(db.String(1))
dataScience = db.Column(db.String(1))
education = db.Column(db.String(1))
engineering = db.Column(db.String(1))
finance = db.Column(db.String(1))
government = db.Column(db.String(1))
law = db.Column(db.String(1))
management = db.Column(db.String(1))
marketing = db.Column(db.String(1))
medical = db.Column(db.String(1))
technology = db.Column(db.String(1))
expDescription = db.Column(db.String(400))
userID = db.Column(db.Integer, db.ForeignKey('user.id'))
class interestedExp(db.Model): …Run Code Online (Sandbox Code Playgroud) 使用flask-migrateand flask-script,我设置了我的项目,这样我只需要做
python manage.py db migrate
Run Code Online (Sandbox Code Playgroud)
在迁移文件夹中,我得到了诸如
0f46602752b7_.py
8fdf8259859b_.py
Run Code Online (Sandbox Code Playgroud)
无法保证第一次迁移先于第二次迁移。Django 通过在所有迁移前添加一个自动递增的数字来解决这个问题。我们可以告诉烧瓶迁移 / alembic 做同样的事情吗?
理想情况下,上面示例中的两个文件将是
001_8fdf8259859b_.py
002_0f46602752b7_.py
Run Code Online (Sandbox Code Playgroud) 我在 Flask-Sqlalchemy 中创建了两个模型。这些模型是Tickets和Namespace。两种模型都使用外键连接。我还创建了 marshmallow-sqlalchemyModelSchema定义以在 RESTful API 中使用。
class Ticket(db.Model):
id = db.Column(db.Integer, primary_key=True)
namespace = db.Column(
db.Integer, db.ForeignKey('namespace.id'), nullable=False)
title = db.Column(db.String)
description = db.Column(db.Text)
status = db.Column(db.String)
severity = db.Column(db.String)
class TicketSchema(ma.ModelSchema):
class Meta:
model = Ticket
include_fk = True
Run Code Online (Sandbox Code Playgroud)
class Namespace(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
class NamespaceSchema(ma.ModelSchema):
class Meta:
model = Namespace
Run Code Online (Sandbox Code Playgroud)
在我看来,我正在尝试按给定的namespace过滤所有票证。这是我的查询:
@app.route("/<string:name>", methods=["GET"])
def get_tickets_by_namespace(name):
tickets_query = Ticket.query.join(Namespace).filter(Namespace.name == name)
result = TicketSchema(many=True).dump(tickets_query).data
return jsonify({"tickets": …Run Code Online (Sandbox Code Playgroud) flask-sqlalchemy ×10
python ×7
sqlalchemy ×7
flask ×6
marshmallow ×2
python-3.x ×2
alembic ×1
mysql ×1
postgresql ×1
pymysql ×1
session ×1
sql ×1