gpt4 book ai didi

python - Sqlalchemy 用整数替换文本

转载 作者:行者123 更新时间:2023-12-01 02:28:15 24 4
gpt4 key购买 nike

我正在使用 Sqlalchemy 设计一个数据库来记录实验室测量结果。我有每个测试结果的表格。我想将测试结果和名称标签存储在同一行中。每当我运行相同的测试时,名称标签可能会出现多次。因此,我不想多次存储实际标签,而是想用整数替换每个标签。该整数将是另一个仅存储标签的表的键。

数据库表定义如下:

from sqlalchemy import Column, Integer, String, Float ,
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class TestResults(Base):

__tablename__ = "test_results"


id = Column(Integer, primary_key=True)
test_name = Column(Integer) # id value in TestNames table
timestamp = Column(Integer)
test_value = Column(Float)


class TestNames(Base):
"""
Lookup table for test_name column in TestResults

"""
__tablename__ = 'test_names'

id = Column(Integer, primary_key=True)
name = Column(String)

理想情况下,我希望能够通过仅输入 test_name 作为字符串来将数据输入到 TestResults 表中,例如

results = TestResults()
results.test_name = 'my_test'
results.test_value = 10.1

为了做到这一点,我认为我需要一个中间函数来检查我输入到 results.test_name 中的字符串是否已经存在于 TestNames 表中,如果存在,那么“真实”的 results.test_name 将使用 ID 号填充对于现有的名称。如果该名称不存在,则将其添加到 TestNames 中,并将新名称的 id 填充到 results.test_name 中。执行此操作的函数如下所示:

def test_name_creator(session,name):
"""
Input
-------
session : sqlalchemy session object

name : str
New test name


Output
--------
id : int
id of test name

"""


# Check if name already exists
name_query = session.query(TestNames).filter(TestNames.name==name).all()
if name_query!=[]:
name_id = name_query[0].id
return name_id

# name does not exist, add to TestNames() table
new_test_name = TestNames()
new_test_name.name = name
session.add(new_test_name)
session.commit()
return new_test_name.id

我无法理解的是如何使用上面的函数拦截 results.test_name='my_test' 的设置,以便返回的 id 实际上填充到 results.test_name 中。我认为这是 Association_proxy + Creator 函数的工作,但我见过的所有示例都返回 Sqlalchemy declarative_base() 类对象,而不是简单的整数。

最佳答案

返回实例本身,而不是返回 ID,如下所示:

def test_name_creator(session, name):
inst = session.query(TestNames).filter(TestNames.name == name).first()
if inst is None:
# Create new TestNames() instance and add to database
inst = TestNames(name=name)
session.add(inst)
return inst

然后,建立一个关系,以便 SQLAlchemy 找出将 ID 放在哪里:

class TestResults(Base):
...
test_name_id = Column(Integer, ForeignKey(TestNames.id))
test_name = relationship(TestNames)

您可以这样设置名称:

results = TestResults(test_name=test_name_creator(session, "my_test"), value=10.1)

如果您想保留将 test_name 作为可以分配的 string 的使用模式,但在 TestNames 中创建行,您可以使用association proxiesUniqueObject 结合食谱。

关于python - Sqlalchemy 用整数替换文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47138268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com