【问题标题】:Avoid several json.loads from MySQL database while Reading阅读时避免来自 MySQL 数据库的多个 json.loads
【发布时间】:2020-04-07 08:50:53
【问题描述】:

我是 python 编程的新手,想在 pythonanywhere.com 上用 flask 建立一个 MySQL 数据库。我使用 Marshmallow-sqlalchemy 从/向数据库执行读/写过程。现在,我对以下复杂的阅读过程感到有些困惑:

@app.route('/getElement')
def getElement():
    idU1=["abc","def","ghi"]
    newTest=Test(idU1=json.dumps(idU1))
    db.session.add(newTest)
    db.session.commit()
    entryString = test_schema.dumps(Test.query.with_entities(Test.idU1).filter_by(idm=1).all())  #Browser views [{"idU1": "[\"abc\", \"def\", \"ghi\"]"}]
    entryList = json.loads(entryString)
    entryDict = entryList[0] #Browser views {"idU1": "[\"abc\", \"def\", \"ghi\"]"}
    valueString = entryDict['idU1']
    valueList = json.loads(valueString)
    result =  valueList[2]
    return json.dumps(result) #Browser views "ghi", which again should be loaded for processing


这就是我设置文件的方式:

app = Flask(__name__)
app.config["DEBUG"] = True

SQLALCHEMY_DATABASE_URI = "mysql+mysqlconnector://{username}:{password}@{hostname}/{databasename}".format(
    username="Ehrismann",
    password="abcdefgh",
    hostname="Ehrismann.mysql.pythonanywhere-services.com",
    databasename="Ehrismann$default",
)

app.config["SQLALCHEMY_DATABASE_URI"] = SQLALCHEMY_DATABASE_URI  # connection specs
app.config["SQLALCHEMY_POOL_RECYCLE"] = 299  # don't care
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False

db = SQLAlchemy(app)  # actually make connection
ma = Marshmallow(app)  # instantiate MarshmallowObject


class Test(db.Model):  # new Table: comment

    __tablename__ = "test"
    idm = db.Column(db.Integer, primary_key=True)  # new Column
    idU1=db.Column(db.String(100), nullable=False)

class TestSchema(ma.ModelSchema):
    class Meta:
        model=Test

test_schema = TestSchema(many=True)

那么,关于如何简化我的代码有什么想法吗?

【问题讨论】:

  • 与您的问题没有直接关系:变量和函数名称应遵循lower_case_with_underscores 样式。
  • 我一整天都喜欢这个家伙。所以同意不同意@AlexanderCécile
  • @itypewithmyhands 同意 PEP 8 和绝大多数库,包括 Flask itself?这样做并不违法,但这些风格指南的存在是有原因的,不是吗?
  • 好吧,老实说,我不得不承认,无论哪种方式,我都应该选择一种风格。在一个文件中使用 test_schema 和 camelCase 变量当然应该得到改进。
  • @AlexanderCécile 我也不喜欢c# 方法中花括号的换行符。也许我只是一个失败的事业。无论如何,@Mxrsxpxxl 是对的,他们绝对应该选择一种风格并坚持下去:)

标签: python mysql flask flask-sqlalchemy marshmallow-sqlalchemy


【解决方案1】:

这里有两个明显的改进:

  • 查询结果无需序列化;在函数内部,您使用查询返回的对象,并且仅在必要时序列化为 json,例如当要通过网络发送数据时。
  • 如果只对第一行进行操作,则无需获取查询中的所有行。
@app.route('/getElement')
def getElement():
    idU1=["abc","def","ghi"]
    newTest=Test(idU1=json.dumps(idU1))
    db.session.add(newTest)
    db.session.commit()

    first_result = Test.query.with_entities(Test.idU1).filter_by(idm=1).first()
    entryDict = json.loads(first_result)
    valueString = entry_dict['idU1']
    valueList = json.loads(valueString)
    result =  valueList[2]
    return json.dumps(result)

MySQL 有一个json column type;使用它而不是字符串列将避免在查询结果上调用json.loads

【讨论】:

  • 不幸的是 first() 方法没有返回有用的结果,因此我决定使用 .all(),它不应该返回另一个结果,因为请求的值都是唯一的。
猜你喜欢
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 2019-04-16
  • 2020-10-21
  • 2010-09-07
  • 2020-08-18
  • 1970-01-01
  • 2020-06-03
相关资源
最近更新 更多