•  


GitHub - coleifer/peewee: a small, expressive orm -- supports postgresql, mysql, sqlite and cockroachdb
Skip to content

coleifer/peewee

Repository files navigation

image

peewee

Peewee is a simple and small ORM. It has few (but expressive) concepts, making it easy to learn and intuitive to use.

  • a small, expressive ORM
  • python 2.7+ and 3.4+
  • supports sqlite, mysql, mariadb, postgresql and cockroachdb
  • tons of extensions

New to peewee? These may help:

Examples

Defining models is similar to Django or SQLAlchemy:

from
 peewee
 import
 *

import
 datetime



db
 =
 SqliteDatabase
(
'my_database.db'
)

class
 BaseModel
(
Model
):
    
class
 Meta
:
        
database
 =
 db


class
 User
(
BaseModel
):
    
username
 =
 CharField
(
unique
=
True
)

class
 Tweet
(
BaseModel
):
    
user
 =
 ForeignKeyField
(
User
, 
backref
=
'tweets'
)
    
message
 =
 TextField
()
    
created_date
 =
 DateTimeField
(
default
=
datetime
.
datetime
.
now
)
    
is_published
 =
 BooleanField
(
default
=
True
)

Connect to the database and create tables:

db
.
connect
()
db
.
create_tables
([
User
, 
Tweet
])

Create a few rows:

charlie
 =
 User
.
create
(
username
=
'charlie'
)
huey
 =
 User
(
username
=
'huey'
)
huey
.
save
()

# No need to set `is_published` or `created_date` since they

# will just use the default values we specified.

Tweet
.
create
(
user
=
charlie
, 
message
=
'My first tweet'
)

Queries are expressive and composable:

# A simple query selecting a user.

User
.
get
(
User
.
username
 ==
 'charlie'
)

# Get tweets created by one of several users.

usernames
 =
 [
'charlie'
, 
'huey'
, 
'mickey'
]
users
 =
 User
.
select
().
where
(
User
.
username
.
in_
(
usernames
))
tweets
 =
 Tweet
.
select
().
where
(
Tweet
.
user
.
in_
(
users
))

# We could accomplish the same using a JOIN:

tweets
 =
 (
Tweet

          .
select
()
          .
join
(
User
)
          .
where
(
User
.
username
.
in_
(
usernames
)))

# How many tweets were published today?

tweets_today
 =
 (
Tweet

                .
select
()
                .
where
(
                    (
Tweet
.
created_date
 >=
 datetime
.
date
.
today
()) 
&

                    (
Tweet
.
is_published
 ==
 True
))
                .
count
())

# Paginate the user table and show me page 3 (users 41-60).

User
.
select
().
order_by
(
User
.
username
).
paginate
(
3
, 
20
)

# Order users by the number of tweets they've created:

tweet_ct
 =
 fn
.
Count
(
Tweet
.
id
)
users
 =
 (
User

         .
select
(
User
, 
tweet_ct
.
alias
(
'ct'
))
         .
join
(
Tweet
, 
JOIN
.
LEFT_OUTER
)
         .
group_by
(
User
)
         .
order_by
(
tweet_ct
.
desc
()))

# Do an atomic update (for illustrative purposes only, imagine a simple

# table for tracking a "count" associated with each URL). We don't want to

# naively get the save in two separate steps since this is prone to race

# conditions.

Counter
.
update
(
count
=
Counter
.
count
 +
 1
).
where
(
Counter
.
url
 ==
 request
.
url
)

Check out the example twitter app .

Learning more

Check the documentation for more examples.

Specific question? Come hang out in the #peewee channel on irc.libera.chat, or post to the mailing list, http://groups.google.com/group/peewee-orm . If you would like to report a bug, create a new issue on GitHub.

Still want more info?

image

I've written a number of blog posts about building applications and web-services with peewee (and usually Flask). If you'd like to see some real-life applications that use peewee, the following resources may be useful:

- "漢字路" 한글한자자동변환 서비스는 교육부 고전문헌국역지원사업의 지원으로 구축되었습니다.
- "漢字路" 한글한자자동변환 서비스는 전통문화연구회 "울산대학교한국어처리연구실 옥철영(IT융합전공)교수팀"에서 개발한 한글한자자동변환기를 바탕하여 지속적으로 공동 연구 개발하고 있는 서비스입니다.
- 현재 고유명사(인명, 지명등)을 비롯한 여러 변환오류가 있으며 이를 해결하고자 많은 연구 개발을 진행하고자 하고 있습니다. 이를 인지하시고 다른 곳에서 인용시 한자 변환 결과를 한번 더 검토하시고 사용해 주시기 바랍니다.
- 변환오류 및 건의,문의사항은 juntong@juntong.or.kr로 메일로 보내주시면 감사하겠습니다. .
Copyright ⓒ 2020 By '전통문화연구회(傳統文化硏究會)' All Rights reserved.
 한국   대만   중국   일본