use*_*993 11 python sqlalchemy
我有以下代码:
query = """
SELECT Coalesce((SELECT sp.param_value
FROM sites_params sp
WHERE sp.param_name = 'ci'
AND sp.site_id = s.id
ORDER BY sp.id DESC
LIMIT 1), -1) AS ci
FROM sites s
WHERE s.deleted = 0
AND s.id = 10
"""
site = db_session.execute(query)
# print site
# <sqlalchemy.engine.result.ResultProxy object at 0x033E63D0>
site = db_session.execute(query).fetchone()
print site # (u'375')
print list(site) # [u'375']
Run Code Online (Sandbox Code Playgroud)
为什么SQLAlchemy会为此查询返回元组而不是dicts?我想使用以下样式来访问查询的结果:
print site.ci
# u'375'
Run Code Online (Sandbox Code Playgroud)
jas*_*aas 17
这是一个老问题,但今天仍然有用.让SQL Alchemy返回字典非常有用,尤其是在使用返回JSON的基于RESTful的API时.
以下是我db_session在Python 3中使用它的方法:
resultproxy = db_session.execute(query)
d, a = {}, []
for rowproxy in resultproxy:
# rowproxy.items() returns an array like [(key0, value0), (key1, value1)]
for column, value in rowproxy.items():
# build up the dictionary
d = {**d, **{column: value}}
a.append(d)
Run Code Online (Sandbox Code Playgroud)
最终结果是该数组a现在以字典格式包含您的查询结果.
至于它如何在SQL Alchemy中工作:
db_session.execute(query)回报ResultProxy对象ResultProxy物体是由RowProxy物体RowProxy对象有一个.items()方法,它返回行中所有项的键值元组.来自文档:
class sqlalchemy.engine.RowProxy(父级,行,处理器,键映射)
单个游标行的代理值.
主要遵循"有序字典"行为,将结果值映射到基于字符串的列名,行中结果的整数位置,以及可以映射到生成此结果集的原始列的列实例(对于结果)对应于构造的SQL表达式).
has_key(key)如果此RowProxy包含给定键,则返回True.
items()返回元组列表,每个元组包含一个键/值对.
keys()将键列表作为此RowProxy表示的字符串返回.
链接:http: //docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.RowProxy.items
seb*_*ian 15
您是否看过ResultProxy文档?它准确描述了@Gryphius和@Syed Habib M建议使用的内容site['ci'].
ResultProxy不会像你声称的那样"返回一个元组" - 它(不奇怪)是一个像元组一样行为(例如打印)的代理,但也支持类字典访问:
来自文档:
可以通过整数位置,不区分大小写的列名称或schema.Column对象访问各列.例如:
row = fetchone()
col1 = row [0]#通过整数位置访问
col2 = row ['col2']#通过名称访问
col3 = row [mytable.c.mycol]#通过Column对象访问.
我已经构建了一个简单的类来像我们流程中的数据库接口一样工作。它是这样的:
from sqlalchemy import create_engine
class DBConnection:
def __init__(self, db_instance):
self.db_engine = create_engine('your_database_uri_string')
self.db_engine.connect()
def read(self, statement):
"""Executes a read query and returns a list of dicts, whose keys are column names."""
data = self.db_engine.execute(statement).fetchall()
results = []
if len(data)==0:
return results
# results from sqlalchemy are returned as a list of tuples; this procedure converts it into a list of dicts
for row_number, row in enumerate(data):
results.append({})
for column_number, value in enumerate(row):
results[row_number][row.keys()[column_number]] = value
return results
Run Code Online (Sandbox Code Playgroud)
您可以使用 轻松将每个结果行转换为字典dict(site)。如果列存在则site['ci']可用。ci
为了拥有site.ci(根据/sf/answers/1545927071/):
from collections import namedtuple
Site = namedtuple('Site', site.keys())
record = Site(*site)
Run Code Online (Sandbox Code Playgroud)
这可能有助于解决OP的问题。我认为他遇到的问题是行对象只包含列值,而不包含列名称本身,就像 ORM 查询的情况一样,其中结果具有包含键和值的dict属性。
| 归档时间: |
|
| 查看次数: |
54089 次 |
| 最近记录: |