SQLite 使用经验小结

数据库的建立

conn = sqlite3.connect('db名') 这是建立connect连接时用到的,当项目中不存在该数据库时,会自动创建。

数据类型:

     NULL: 表示该值为NULL值。
     INTEGER: 无符号整型值。
     REAL: 浮点值。
     TEXT: 文本字符串,存储使用的编码方式为UTF-8、UTF-16BE、UTF-16LE。
     BLOB: 存储Blob数据,该类型数据和输入数据完全相同。

建表例子:

   CREATE TABLE Custom (
              id  INTEGER PRIMARY KEY DEFAULT NULL,
              custom_name VARCHAR(50) NOT NULL,
              remark TEXT DEFAULT NULL DEFAULT '无'
            );

    CREATE TABLE Provice_info(
          id INTEGER PRIMARY KEY NOT NULL,
          custom INT NOT NULL,
          provice_name VARCHAR(20) NOT NULL,
          first_weight_num REAL,
          first_weight_price REAL,
          next_weight_price REAL,
          FOREIGN KEY (custom) REFERENCES Custom(id) on delete cascade 
    )

常见操作

使用sqlite,首先需要建立connect连接,然后通过cursor(游标)来对数据进行操作(execute),当是查操作时,就不需要connect.commit()了,可以通过cursor.fetchone() / cursor.fetchall()来获取查到的数据,前者为一个元组,后者为一个列表,列表中存储着元组,最后记得关闭connect连接就行了。

    conn = sqlite3.connect('test.db')
    cursor = conn.cursor()
    cursor.execute(SQL)
    conn.commit()
    conn.close()

经验操作

  • 当使用SQLite进行操作时,最好以表为类来面向对象编程。

  • 在add操作时,可以在connect.commit()后通过cursor.lastrowid来获取刚刚创建的数据的id并返回,有时会有意想不到的方便。

  • 在delete操作时,当有外键时,想联级删除的话,除了在创建表的时候加上on delete cascade还需要通过cursor.execute("PRAGMA foreign_keys=ON")这条语句才能实现联级删除。

  • 在针对查找方面,可以创建多个查找方法,如精确查找,模糊匹配,查询全部,这些有时有意想不到的方便。

  • 针对防止SQL注入,可以通过SQLite特有的语法?,结合execute(SQL, (parameter1, parameter2...))来实现。

例子:

class Custom:
    def __init__(self):
        self.conn = sqlite3.connect('test.db')
        self.cur = self.conn.cursor()

    def add_custom(self, custom_name, remark='无'):
        """
        添加一条客户数据,加了去重检查,保证客户数据唯一性
        :param custom_name:
        :param remark:
        :return: id
        """
        if self.find_custom(custom_name) > 0:
            raise Exception('你输入的用户名 {} 已存在!'.format(custom_name))
        SQL = """
        INSERT INTO Custom (custom_name, remark) VALUES (?, ?);
        """
        # 防止SQL注入攻击
        self.cur.execute(SQL, (custom_name, remark))
        self.conn.commit()
        custom_id = self.cur.lastrowid
        return custom_id

    def delete_custom(self, custom_id):
        SQL = """
        DELETE FROM Custom WHERE id=?
        """
        # SQLite在3.6.19版本中才开始支持外键约束,但是为了兼容以前的程序,
        # 默认并没有启用该功能,如果要启用该功能每次都要需要使用如下语句:PRAGMA foreign_keys = ON来打开。
        self.cur.execute("PRAGMA foreign_keys=ON")
        self.cur.execute(SQL, (custom_id,))
        self.conn.commit()

    def update_custom(self, custom_id, custom_name, remark='无'):
        SQL = """
        UPDATE Custom SET custom_name=?, remark=? WHERE id=?
        """
        self.cur.execute(SQL, (custom_name, remark, custom_id))
        self.conn.commit()

    def find_custom(self, custom_name):
        """
        通过客户名找到id
        :param custom_name:
        :return: id(int) / 0(没有该数据时)
        """
        SQL = """
        SELECT id FROM Custom WHERE custom_name=?
        """
        self.cur.execute(SQL, (custom_name,))
        custom_id = self.cur.fetchone()
        return custom_id[0] if custom_id else 0

    def find_custom_like(self, custom_name):
        """
        通过客户名找到id
        :param custom_name:
        :return: id(int) / 0(没有该数据时)
        """
        SQL = """
        SELECT id FROM Custom WHERE custom_name LIKE '%{}%'
        """.format(custom_name)
        self.cur.execute(SQL)
        custom_id = self.cur.fetchall()
        print(custom_id)
        if len(custom_id) > 1:
            raise Exception('客户名: {} 错误,请传入正确的客户名!'.format(custom_name))
        return custom_id[0][0] if custom_id else 0

    def fetch_custom(self):
        """
        返回所有custom对象
        :return: {'客户1': 'remark1', '客户2': 'remark2' ...}
        """
        SQL = """
        SELECT custom_name, remark FROM Custom
        """
        self.cur.execute(SQL)
        customs = self.cur.fetchall()
        data = {custom_name: remark for custom_name, remark in customs}
        return data

    def close(self):
        self.cur.close()
        self.conn.close()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,719评论 0 10
  • 1.数据库简介 人类在进化的过程中,创造了数字、文字、符号等来进行数据的记录,但是承受着认知能力和创造能力的提升,...
    大熊_7d48阅读 514评论 0 1
  • iOS8 Core Image In Swift:视频实时滤镜 :https://blog.csdn.net/zh...
    AZander阅读 423评论 0 0