SQLAlchemy ORM get()即使实体存在也不返回任何结果

2024-05-23 17:49:15 发布

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

基本上我有两个API端点,一个用于创建规则,另一个用于将查询分配给这些规则。将查询分配给规则的过程通常在规则创建之后进行。例如,API调用如下所示:

POST /api/rules/
PATCH /api/rules/<id>/queries/

第一个端点创建一个新的规则并将其存储在数据库中。方法如下(暂时忽略print语句):

^{pr2}$

第二个端点使用创建的规则的ID调用,但是由于某些原因,API调用有时(但并非总是)以404 not Found结束:

# PATCH /api/rules/<id>/queries/
def patch(self, data, id):
    print 'Got rule: {}'.format(
        db.engine.execute(
            'select * from rule where id = ?', id).first())
    print 'Does SQLAlchemy see this? {}'.format(
        db.session.query(Rule).get(id) is not None)

    rule = db.session.query(Rule).get_or_404(id)
    # ... the rest ...

我已经创建了一个简单的for循环,它尝试创建10个规则并为它们分配10个查询。有时第二个API调用(分配查询)返回404状态。这个问题似乎只发生在生产中(可能是由于较高的负载)。当time.sleep(1)正好位于第一个和第二个API调用之间时,问题也就消失了。在

这似乎是SQLAlchemy的ORM中的一个问题,它有时没有数据库的最新状态(?),请参阅print语句的以下输出:

[1/POST] : Rule: (54374L, u'WBB multiplication rule')
[1/PATCH]: Got rule: (54374L, u'WBB multiplication rule')
[1/PATCH]: Does SQLAlchemy see this? True
[2/POST] : Rule: (54375L, u'WBB multiplication rule')
[2/PATCH]: Got rule: (54375L, u'WBB multiplication rule')
[2/PATCH]: Does SQLAlchemy see this? False
[3/POST] : Rule: (54376L, u'WBB multiplication rule')
[3/PATCH]: Got rule: (54376L, u'WBB multiplication rule')
[3/PATCH]: Does SQLAlchemy see this? True

附加信息

服务器在CentOS 7上运行,Maria DB 10.0.21。下面是一些相关Python包的列表:

  • SQLAlchemy==1.0.6
  • MySQL python==1.2.5
  • 烧瓶==0.10.1
  • 烧瓶静止==0.3.5

注意,我没有使用Flask SQLAlchemy,尽管db.session包含一个作用域的session对象,并且我已经实现了我自己的first_or_404和{}方法。在

使用以下配置创建引擎:

engine = create_engine(
    'mysql://{username}:{password}@{host}/{database}?charset=utf8'.format(
        **self.config),
    pool_size=50,
    pool_recycle=3600,
)

使用echo='debug'

创建规则的第一个请求:

[2016-04-18 20:51:25,665: INFO/green1c0ea50 > green4196370] INSERT INTO rule (name, project_id, project_element_id, type, priority, applies, deletable) VALUES (%s, %s, %s, %s, %s, %s, %s)
[2016-04-18 20:51:25,667: INFO/green1c0ea50 > green4196370] (u'WBB multiplication rule', 7013L, u'50745006', u'calc', 255, 1, 1)
[2016-04-18 20:51:25,669: INFO/green1c0ea50 > green4196370] INSERT INTO rule_calc (id, expression) VALUES (%s, %s)
[2016-04-18 20:51:25,670: INFO/green1c0ea50 > green4196370] (54625L, u'%MAX_CPC_SEARCH%*2')
[2016-04-18 20:51:25,673: INFO/green1c0ea50 > green4196370] COMMIT
[2016-04-18 20:51:25,678: INFO/green1c0ea50 > green4196370] BEGIN (implicit)
[2016-04-18 20:51:25,680: INFO/green1c0ea50 > green4196370] SELECT rule.id AS rule_id, rule.name AS rule_name, rule.project_id AS rule_project_id, rule.project_element_id AS rule_project_element_id, rule.type AS rule_type, rule.priority AS rule_priority, rule.applies AS rule_applies, rule.deletable AS rule_deletable 
FROM rule 
WHERE rule.id = %s
[2016-04-18 20:51:25,681: INFO/green1c0ea50 > green4196370] (54625L,)
[2016-04-18 20:51:25,682: INFO/MainProcess]

第二个请求在404失败时尝试获取规则

[2016-04-18 20:51:25,832: INFO/green1c0fa50 > green31f1e10] SELECT rule.id AS rule_id, rule.name AS rule_name, rule.project_id AS rule_project_id, rule.project_element_id AS rule_project_element_id, rule.type AS rule_type, rule.priority AS rule_priority, rule.applies AS rule_applies, rule.deletable AS rule_deletable 
FROM rule 
WHERE rule.id = %s
[2016-04-18 20:51:25,832: INFO/green1c0fa50 > green31f1e10] (u'54625',)

Tags: nameinfoprojectapiidsqlalchemy规则as