[英]Selecting distinct column values in SQLAlchemy/Elixir
在我使用 SQLAlchemy 和 Elixir 編寫的一個小腳本中,我需要獲取特定列的所有不同值。 在普通的 SQL 中,這很簡單
SELECT DISTINCT `column` FROM `table`;
而且我知道我可以“手動”運行該查詢,但如果可以的話,我寧願堅持使用 SQLAlchemy 聲明性語法(和/或 Elixir)。 我確信這一定是可能的,我什至在 SQLAlchemy 文檔中看到了對這類事情的暗示,但我已經在該文檔中尋找了幾個小時(以及 Elixir 的文檔),我就是不能似乎實際上弄清楚了如何完成。 那么我錯過了什么?
您可以查詢映射類的列屬性,並且 Query 類有一個生成的distinct()
方法:
for value in Session.query(Table.column).distinct():
pass
對於這個類:
class Assurance(db.Model):
name = Column(String)
你可以這樣做:
assurances = []
for assurance in Assurance.query.distinct(Assurance.name):
assurances.append(assurance.name)
你將擁有不同值的列表
for user in session.query(users_table).distinct():
print user.posting_id
我想計算不同的值,使用.distinct()
和.count()
會先計算,得到一個值,然后做不同的。 我必須執行以下操作
from sqlalchemy.sql import func
Session.query(func.count(func.distinct(Table.column))
上課,
class User(Base):
name Column(Text),
id Column(Integer, primary_key=True)
方法 1:使用 load_only
from sqlalchemy.orm import load_only
records= (db_session.query(User).options(load_only(name)).distinct().all())
values = [record[0] if len(record) == 1 else record for record in records] #list of distinct values
方法2:沒有任何導入
records = db_session.query(User.name).distinct().all()
l_values = [record.__dict__[l_columns[0]] for record in records]
SQL Alchemy 版本 2 鼓勵使用select()
function。 您可以使用 SQL Alchemy table
來構建提取唯一值的 select 語句:
select(distinct(table.c.column_name))
SQL Alchemy 2.0 遷移 ORM 用法:
"The biggest visible change in SQLAlchemy 2.0 is the use of Session.execute() in conjunction with select() to run ORM queries, instead of using Session.query()."
使用 pandas 收集唯一值的可重現示例。
為 iris 數據集定義一個 ORM 結構,然后使用 pandas 將數據插入到 SQLite 數據庫中。 Pandas 插入帶有if_exists="append"
參數,以便它保留 SQL Alchemy 中定義的結構。
import seaborn
import pandas
from sqlalchemy import create_engine
from sqlalchemy import MetaData, Table, Column, Text, Float
from sqlalchemy.orm import Session
定義元數據並創建表
engine = create_engine('sqlite://')
meta = MetaData()
meta.bind = engine
iris_table = Table('iris',
meta,
Column("sepal_length", Float),
Column("sepal_width", Float),
Column("petal_length", Float),
Column("petal_width", Float),
Column("species", Text))
iris_table.create()
將數據加載到表中
iris = seaborn.load_dataset("iris")
iris.to_sql(name="iris",
con=engine,
if_exists="append",
index=False,
chunksize=10 ** 6,
)
重新使用上面的iris_table
。
from sqlalchemy import distinct, select
stmt = select(distinct(iris_table.c.species))
df = pandas.read_sql_query(stmt, engine)
df
# species
# 0 setosa
# 1 versicolor
# 2 virginica
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.