避免几个json.loads文件读取时从MySQL数据库

2024-07-03 06:01:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python编程的新手,想用flaskonpythonanywhere.com。我使用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)

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


Tags: nametestbrowserconfigjsonappdbsqlalchemy
1条回答
网友
1楼 · 发布于 2024-07-03 06:01:00

这里有两个明显的改进:

  • 不需要序列化查询结果;在函数中,您使用查询返回的对象,并且仅在必要时序列化为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。你知道吗

相关问题 更多 >