From eade73fdea31bb12fdb68352266d89e0c5b83526 Mon Sep 17 00:00:00 2001 From: jackfrued Date: Thu, 28 Jun 2018 11:54:20 +0800 Subject: [PATCH] =?UTF-8?q?'=E6=B7=BB=E5=8A=A0=E4=BA=86PyMySQL=E7=9A=84?= =?UTF-8?q?=E5=8F=82=E8=80=83=E4=BB=A3=E7=A0=81'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Day36-40/code/contact/main.py | 155 ++++++++++++++++++++++++++ Day36-40/code/contact/test01.py | 8 ++ Day41-55/shop/static/images/Thumbs.db | Bin 21504 -> 0 bytes 3 files changed, 163 insertions(+) create mode 100644 Day36-40/code/contact/main.py create mode 100644 Day36-40/code/contact/test01.py delete mode 100644 Day41-55/shop/static/images/Thumbs.db diff --git a/Day36-40/code/contact/main.py b/Day36-40/code/contact/main.py new file mode 100644 index 0000000..20e67ec --- /dev/null +++ b/Day36-40/code/contact/main.py @@ -0,0 +1,155 @@ +import pymysql + +INSERT_CONTACTER = """ +insert into tb_contacter (conname, contel, conemail) +values (%s, %s, %s) +""" +DELETE_CONTACTER = """ +delete from tb_contacter where conid=%s +""" +UPDATE_CONTACTER = """ +update tb_contacter set conname=%s, contel=%s, conemail=%s +where conid=%s +""" +SELECT_CONTACTERS = """ +select conid as id, conname as name, contel as tel, conemail as email +from tb_contacter limit %s offset %s +""" +COUNT_CONTACTERS = """ +select count(conid) as total from tb_contacter +""" + + +def input_contacter_info(): + name = input('姓名: ') + tel = input('手机: ') + email = input('邮箱: ') + return name, tel, email + + +def add_new_contacter(con): + name, tel, email = input_contacter_info() + try: + with con.cursor() as cursor: + if cursor.execute(INSERT_CONTACTER, + (name, tel, email)) == 1: + print('添加联系人成功!') + except pymysql.MySQLError as err: + print(err) + print('添加联系人失败!') + + +def delete_contacter(con, contacter_id): + try: + with con.cursor() as cursor: + if cursor.execute(DELETE_CONTACTER, (contacter_id, )) == 1: + print('联系人已经删除!') + except pymysql.MySQLError as err: + print(err) + print('删除联系人失败!') + + +def edit_contacter_info(con, contacter): + name, tel, email = input_contacter_info() + contacter['name'] = name or contacter['name'] + contacter['tel'] = tel or contacter['tel'] + contacter['email'] = email or contacter['email'] + try: + with con.cursor() as cursor: + if cursor.execute(UPDATE_CONTACTER, + (contacter['name'], contacter['tel'], + contacter['email'], contacter['id'])) == 1: + print('联系人信息已经更新!') + except pymysql.MySQLError as err: + print(err) + print('更新联系人信息失败!') + + +def show_contacter_detail(con, contacter): + print('姓名:', contacter['name']) + print('手机号:', contacter['tel']) + print('邮箱:', contacter['email']) + choice = input('是否编辑联系人信息?(yes|no)') + if choice == 'yes': + edit_contacter_info(con, contacter) + else: + choice = input('是否删除联系人信息?(yes|no)') + if choice == 'yes': + delete_contacter(con, contacter['id']) + + +def find_all_contacters(con): + page, size = 1, 5 + try: + with con.cursor() as cursor: + cursor.execute(COUNT_CONTACTERS) + total = cursor.fetchone()['total'] + while True: + cursor.execute(SELECT_CONTACTERS, + (size, (page - 1) * size)) + contacters_list = [] + for index, row in enumerate(cursor.fetchall()): + contacters_list.append(row) + print('[%d]: %s' % (index, row['name'])) + choice = input('是否查看联系人详情?(yes|no)') + if choice.lower() == 'yes': + index = int(input('请输入编号: ')) + if 0 <= index < cursor.rowcount: + show_contacter_detail(con, contacters_list[index]) + if page * size < total: + choice = input('继续查看下一页?(yes|no)') + if choice.lower() == 'yes': + page += 1 + else: + break + else: + print('没有下一页记录啦!') + break + + except pymysql.MySQLError as err: + print(err) + + +def find_contacters_by_name(con): + pass + + +def find_contacters(con): + while True: + print('1. 查看所有联系人') + print('2. 搜索联系人') + print('3. 退出查找') + choice = int(input('请输入: ')) + if choice == 1: + find_all_contacters(con) + elif choice == 2: + find_contacters_by_name(con) + elif choice == 3: + break + + +def main(): + con = pymysql.connect(host='10.7.185.126', port=3306, + user='root', passwd='123456', + db='contact', charset='utf8', + autocommit=True, + cursorclass=pymysql.cursors.DictCursor) + while True: + print('=====通讯录=====') + print('1. 新建联系人') + print('2. 查找联系人') + print('3. 退出系统') + print('===============') + choice = int(input('请选择: ')) + if choice == 1: + add_new_contacter(con) + elif choice == 2: + find_contacters(con) + elif choice == 3: + con.close() + print('谢谢使用, 再见!') + break + + +if __name__ == '__main__': + main() diff --git a/Day36-40/code/contact/test01.py b/Day36-40/code/contact/test01.py new file mode 100644 index 0000000..f883e8a --- /dev/null +++ b/Day36-40/code/contact/test01.py @@ -0,0 +1,8 @@ +def main(): + list1 = ['orange', 'grape', 'banana', 'waxberry', 'pitaya'] + for index, val in enumerate(list1): + print('%d: %s' % (index, val)) + + +if __name__ == '__main__': + main() diff --git a/Day41-55/shop/static/images/Thumbs.db b/Day41-55/shop/static/images/Thumbs.db deleted file mode 100644 index ebb80b1ee7c3acae4a93634984ae80f79be0d081..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21504 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 S_?Q^fMT|)68Aq9