Python ORM | peewee

python使用过程中,难免要用到一些关系型数据库,例如sqlite, mysql, postgresql,而增删查改过程中,字符串的拼接着实让人头大

如果你有用过Django web后端框架,自带的ORM组件简化了数据库的操作,在常规数据库的操作方式上,又抽象了一层,把一个个的数据库文件,一张张的表,抽象为一个个的对象,一个个的 python类;增删查改等等操作,抽象为一个个的函数和属性,以面向对象编程的思路和方式来操作数据库。

这里推荐一个独立的Python ORM库—-peewee,不需要Django环境。

github项目地址:

https://github.com/coleifer/peewee

文档地址:

http://docs.peewee-orm.com/en/latest/peewee/quickstart.html

如果你有使用Django ORM的经验,peewee非常容易理解和上手

创建数据库文件和表:

from peewee import *
import datetime


db = SqliteDatabase('ip_monitor_db.db')

class ip_monitor_db(Model):
    manage_ip = CharField(unique=True)
    online_or_not = BooleanField(default=True)
    monitor_or_not = BooleanField(default=True)
    sent_or_not = BooleanField(default=False)
    last_sent_time = DateTimeField(default=datetime.datetime.now)
    

    class Meta:
        database = db # if there are many databases ,This model uses the "testing.db" database.

class Person(Model):
    name = CharField()
    birthday = DateField()

    class Meta:
        database = db # This model uses the "ip_monitor_db.db" database.

if __name__ == '__main__':
    ############################# create DB and Tables
    db.connect()
    db.create_tables([ip_monitor_db,Person])

插入

     ############################### insert items (2 ways)
     ip1 = ip_monitor_db(manage_ip = 'baidu.com')
     ip1.save()
     ip2 = ip_monitor_db(manage_ip = '114.114.114.114', monitor_or_not = False)
     ip2.save()
     ip3 = ip_monitor_db.create(manage_ip = '100.64.0.1')

查询

    ############################# query items
    # 查询所有
     all = ip_monitor_db.select()
     print(all)
    # 条件查询(2 ways)
     all1 = ip_monitor_db.get(ip_monitor_db.manage_ip == 'baidu.com')
     print(all1)
     all2 = ip_monitor_db.select().where(ip_monitor_db.online_or_not == True)
     all2 = ip_monitor_db.select().where(ip_monitor_db.online_or_not == True).get() # only get the first one element when there are many targets
   # 如果有多条查询结果,可以迭代该结果
    for ip in ip_monitor_db.select():
        print(ip.manage_ip)

    #
    query = ip_monitor_db.select().where(ip_monitor_db.online_or_not == True)
    for element in query:
        print(element.manage_ip, element.last_sent_time)

更新

    ####################################update items
     all4 = ip_monitor_db.get(ip_monitor_db.manage_ip == 'baidu.com')
     all4.manage_ip = '114.114.114.114'
     all4.monitor_or_not = False
     all4.save()
     print(all4.manage_ip)
     print(all4.monitor_or_not)

删除

     ###########################delete items
     all3 = ip_monitor_db.delete().where(ip_monitor_db.monitor_or_not == False).execute()
     print(all3)

其他还有更多,联合查找,排序,外键等等参考官方文档

附上 常规的字符串拼接操作数据库方式,sqlite3为例

from asyncio.windows_events import NULL
import sqlite3
from datetime import datetime, timedelta


def create_tab():
    conn = sqlite3.connect('ip_monitor_db.sqlite3')
    c = conn.cursor()
    #  创建表
    sql = '''
        CREATE TABLE ip_monitor_db(
        ID INTEGER PRIMARY KEY  AUTOINCREMENT,
		manage_ip text NOT NULL UNIQUE,
        online_or_not bool NOT NULL,
		monitor_or_not bool NOT NULL,
        sent_or_not bool NOT NULL,
        last_sent_time datetime NOT NULL)
        '''
    c.execute(sql)
    conn.commit()
    c.close()
    conn.close()


def insert_tab(manage_ip, online_or_not = True, monitor_or_not= True, last_sent_time = datetime.now(), sent_or_not = False):
    conn = sqlite3.connect('ip_monitor_db.sqlite3')
    c = conn.cursor()
    #  插入表
    sql = '''INSERT INTO ip_monitor_db(manage_ip, online_or_not, monitor_or_not, last_sent_time, sent_or_not) VALUES (?,?,?,?,?)'''
    c.execute(sql, (manage_ip, online_or_not, monitor_or_not, last_sent_time, sent_or_not))
    conn.commit()
    c.close()
    conn.close()

def update_tab(manage_ip, online_or_not=NULL, last_sent_time = NULL, sent_or_not = NULL):
    conn = sqlite3.connect('ip_monitor_db.sqlite3')
    c = conn.cursor()
    #  更新表
    sql = '''UPDATE ip_monitor_db SET online_or_not = ?, last_sent_time = ?, sent_or_not = ? WHERE manage_ip = ?'''
    c.execute(sql, (online_or_not, last_sent_time, sent_or_not, manage_ip))
    conn.commit()
    c.close()
    conn.close()

def select_tab(column='*'):
    conn = sqlite3.connect('ip_monitor_db.sqlite3')
    c = conn.cursor()
    #  查询表
    sql = f'''SELECT {column} FROM ip_monitor_db'''
    results = c.execute(sql)
    results_all = results.fetchall()
    return results_all
    conn.commit()
    c.close()
    conn.close()



if __name__ == '__main__':
    #create_tab()
    #insert_tab(manage_ip='baidu.com')
    #insert_tab(manage_ip='114.114.114.114')
    #insert_tab(manage_ip='100.64.0.1')
    print(select_tab('manage_ip'))
    print(select_tab('manage_ip'))

以上

Related Posts

Leave a Reply

Your email address will not be published.