Reputation: 1867
Using the PeeWee ORM I have the following query:
query = DataModel.select()where(DataModel.field == "value")
Is there any way to convert query
into a pandas DataFrame without iterating over all the values? I'm looking for a more "Pythonic" way of doing this.
Upvotes: 17
Views: 7142
Reputation: 1854
Assuming query
is of type peewee.SelectQuery
, you could do:
df = pd.DataFrame(list(query.dicts()))
EDIT: As Nicola points out below, you're now able to do pd.DataFrame(query.dicts())
directly.
Upvotes: 39
Reputation: 19037
The following is a more efficient way, because it avoids creating the list and then pass it to the pandas dataframe. It also has the side benefit of preserving the order of the columns:
df = pd.read_sql(query.sql()[0], database.connection())
You need direct access to the peewee database
, for example, in the quickstart tutorial corresponds to:
db = SqliteDatabase('people.db')
Of course, you can also create your own connection to the database.
Drawback: you should be careful if you have repeated columns in the two tables, e.g. id
columns would appear twice. So make sure to correct those before continuing.
If you are using a peewee proxy
import peewee as pw;
database_proxy = pw.Proxy()
then the connection is here:
database_proxy.obj.connection()
Upvotes: 4
Reputation: 91
Just in case someone finds this useful, I was searching for the same conversion but in Python 3. Inspired by @toto_tico's previous answer, this is what I came up with:
import pandas
import peewee
def data_frame_from_peewee_query(query: peewee.Query) -> pandas.DataFrame:
connection = query._database.connection() # noqa
sql, params = query.sql()
return pandas.read_sql_query(sql, connection, params=params)
Checked with Python 3.9.6, pandas==1.3.2
and peewee==3.14.4
, using peewee.SqliteDatabase
.
Upvotes: 6