• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
MKT-porter
博客园    首页    新随笔    联系   管理    订阅  订阅
python数据库

 

1安装数据库

 

2代码基本例程

  • 创建数据库
  • 打开数据库
  • 创建数据表
  • 基本操作  读取 写入 修改 删除
  • 关闭数据库
  • 没有界面
  • 没有线程

 

# -*- coding: utf-8 -*-
  
#https://www.runoob.com/python3/python3-mysql.html
#https://blog.csdn.net/DKman803/article/details/1925326  保存中文

import time 
import pymysql
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
#使用前#1
  
class Mysql():
      
    def __init__(self,
         host="127.0.0.1",
         user="root",
         password="admin",
         database="Database_1",  #数据库名字
         table='Table_sensor1',    #数据表名字
         charset='utf8',               
         port=3306):
          
        self.host = host
        self.port = port
        self.user = user
        self.password = password
        self.database = database
        self.table=table
        self.charset = charset
        self.conn = None
        self.cur = None


                   
    #1-0 创建数据库(如果存在不创建),然后链接数据库
    def sql_CreatDatabase(self):
        self.creat_spldatabase()
        #self.open_sql()#打开数据库

        

      
    #1-1创建数据库-没有数据表
    def creat_spldatabase(self):
        #最开始创建 区别于传建好的引用
        self.conn1 = pymysql.connect(host=self.host,
           port=self.port,
           user=self.user,
           password=self.password,
           charset=self.charset)
        self.cur1 = self.conn1.cursor()
        # 创建数据库的sql(如果数据库存在就不创建,防止异常)
        sql = f"CREATE DATABASE IF NOT EXISTS {self.database}"
        #sql = f"drop DATABASE if exists {self.database}"
        try:
            # 执行创建数据库的sql
            self.cur1.execute(sql)
            self.conn1.commit()
            self.cur1.close()
            self.conn1.close()
            print('数据库创建成功')
        except:
      
            print('创建失败')


    #1-2连接数据库-无数据表
    def open_sql(self):
       # print("连接已打开")
        self.conn = pymysql.connect(host=self.host,
                   port=self.port,
                   user=self.user,
                   password=self.password,
                   database=self.database,
                   charset=self.charset)
        self.cur = self.conn.cursor()

    #1-3删除数据库         
    def delete_database(self,DatabaseName):
        #DatabaseName=self.database
        try:
            sql = f"drop database if exists {DatabaseName}"
            self.cur.execute(sql)
            self.conn.commit()#保存结果
            print('删除数据库成功')
        except:
            self.conn.rollback()
            print('删除数据库失败')




         
    #2-1-1创建数据库中的数据表  
    # 表名字table_name   表结构  内部构造 
    def creat_sqltable(self,table_name):         
        sql = f'''
             create table IF NOT EXISTS {table_name}(
               id int PRIMARY KEY NOT NULL auto_increment,  #自动增加int 如果后续这个插入数据ID相同就差不进去
               fingerID CHAR(20) not null,                      #指纹ID
               fingerName CHAR(20),                                 #指纹名字
               comment_time TIMESTAMP not NULL DEFAULT CURRENT_TIMESTAMP   #当前时间
              )default charset=utf8;
              '''
                                     
        self.cur.execute(sql)
        self.conn.commit()#保存结果
        #self.close_sql()

    #2-2删除数据库中的数据表
    def delete_sqltable(self,table_name):
        sql = f"drop table if exists {table_name}"
        self.cur.execute(sql)
        self.conn.commit()#保存结果
 
    #2-1-2创建数据库中的数据表  
    def creat_sqltable_teacher(self,table_name):         
        '''
        表名字-employee
        +------+------+----------------+------+
        | id   | number | iphon          | TIMESTAMP  |
        +------+------+----------------+------+
        |    2 | Tom  | 15529672865 | 2021/3/2    |
        +------+------+----------------+------+
        '''   
        sql = f'''
             create table IF NOT EXISTS {table_name}(
               id int PRIMARY KEY NOT NULL auto_increment,  #自动增加int 如果后续这个插入数据ID相同就差不进去
               teachername CHAR(30) not null,                      #老师名字char
               classname CHAR(30),                                 #课程名字char        
               workId CHAR(255),                                    #作业ID
               workMsg CHAR(255),                                  #作业内容
               timeBigen CHAR(50),                                #开始时间
               timeEnd CHAR(50),                                  #结束时间
               boxId CHAR(50),                                  #箱子
               comment_time TIMESTAMP not NULL DEFAULT CURRENT_TIMESTAMP   #插入时间记录
              )default charset=utf8;
              '''
                                     
        self.cur.execute(sql)
        self.conn.commit()#保存结果
         
    #2-1-3创建数据库中的数据表      
    def creat_sqltable_StudentPassWork(self,table_name):         
        '''
        表名字-employee
        +------+------+----------------+------+
        | id   | number | iphon          | TIMESTAMP  |
        +------+------+----------------+------+
        |    2 | Tom  | 15529672865 | 2021/3/2    |
        +------+------+----------------+------+
        '''   
        sql = f'''
             create table IF NOT EXISTS {table_name}(
               id int PRIMARY KEY NOT NULL auto_increment,  #自动增加int 如果后续这个插入数据ID相同就差不进去                           
               workId CHAR(255),                                    #作业ID
               studentname CHAR(30) not null,                      #学生名字char
               studentnumber CHAR(30) not null,                      #学生学号
               classname CHAR(30),                                 #课程名字char   
               teachername CHAR(30),                                 #老师名字char           
               comment_time TIMESTAMP not NULL DEFAULT CURRENT_TIMESTAMP   #插入时间记录
              )default charset=utf8;
              '''
                                     
        self.cur.execute(sql)
        self.conn.commit()#保存结果       


         
    #3关闭数据库
    def close_sql(self):
        # 提交到数据库执行
        self.conn.commit()
        
        self.cur.close()#数据库当前操作对象
        self.conn.close()#数据库连接
         
         
    #4-1 插入数据  
    def insert_sql_finger(self,table_name,fingerID,fingerName):
        # SQL 插入语句
        #  id int PRIMARY KEY NOT NULL auto_increment,
        #  因为id是自动增长 所以不插入的话自动有 也可以手动查 但是不能一样       
        sql =f"insert into {table_name}(fingerID, fingerName) values ('%s','%s')" % (fingerID, fingerName)                             
        sql=sql.encode('utf8')  
        try:
           # 执行sql语句
           self.cur.execute(sql) 
           self.conn.commit()
           print('数据插入成功')
        except:
           # 如果发生错误则回滚
           self.conn.rollback()
           print('数据插入失败')
 
 
  
    #4-2-1 查找指定数据表全部数据         
    # table_name 数据表名字     
    def find_sql_ShowAll(self,table_name):
        # SQL 查询语句
        #self.cur.execute('SET CHARACTER SET utf8;')
        #self.cur.execute('SET character_set_connection=utf8;')
        sql =f"select * from {table_name}"
        #sql = "select * from employee where name = '%s'" % ('dongdong')
        #sql = "select * from employee where age > %d" % (18)
        #print(sql)
        try:
           # 执行SQL语句
           self.cur.execute(sql)
           # 获取所有记录列表
           results = self.cur.fetchall()
           #print('数据查询结果开始打印')
 
           if len(results)!=0: 
               for row in results:
                   print(row)    
                   #idnum = row[0]
                   #tname = row[1]
                   #...
                   #time=row[5]
            
           return results
           #print('数据查询结果打印完毕')
        except:
           print ("查询失败")
           self.conn.rollback()            
   
            
    #4-2-2 查找指定单个数据  
    # table_name 数据表名字
    # fingerID   要查询的内容
    def find_sql_finger(self,table_name,fingerID):
        # SQL 查询语句
        #sql =f"select * from {self.table}"
        sql = f"select * from {table_name} where fingerID in ('%s')" % (fingerID)
        #sql = "select * from employee where age > %d" % (18)
         
        try:
           # 执行SQL语句
           self.cur.execute(sql)
           # 获取所有记录列表
           results = self.cur.fetchall()
             
           if len(results)!=0:            
               for row in results:
                   print("查询指纹记录:"+str(row))    
                   #idnum = row[0]
                   #tname = row[1]
                   results=1
                   workmsg=row
           else:
               results=0
               workmsg=0
               print('没有查询到记录')
              
           return results,workmsg  
           #print('数据查询结果打印完毕')
        except:
           print ("查询错误")
           self.conn.rollback()  
             
             
  
 
 

    #4-3-1 修改数据表中指定数据


    def change_sql(self,table_name,num,iphon):    
        #修改查询条件的数据
         
        #sql = "update employee set age = age + 1 where sex = '%c'" % (sex)
        sql = f"update {table_name} set iphon = {iphon} where number = {num}"
        try:
            self.cur.execute(sql)
            print("修改成功:")
            self.conn.commit()
        except:
            self.conn.rollback()
            print('修改失败')
              

    #4-4-1 删除数据表中指定数据    
    # 
    #      
    def delete_sql_finger(self,table_name,fingerID):
        #删除查询条件的数据
        
        sql = f"delete from {table_name} where fingerID = '%s'" % (fingerID)
        sql=sql.encode('utf8')
        #sql = f"delete from {self.table} where age = 20"
        #sql = "delete from employee where passwd = '%s'" % ('123456')
        #print(sql)
        try:
            self.cur.execute(sql)
            self.conn.commit()
            print('删除成功')
            #self.conn.commit()
        except:
            self.conn.rollback()
            print('删除失败')
             

         
       
         
         
         

  
#(1)第一种方式创建数据库
'''
命令行-命令后续结尾分号
mysql -u root -p
输入密码 admin
查看当前数据库
SHOW DATABASES;
创建新的数据库
creat database sensorb;
重新查看是否成功
SHOW databases;
使用数据库
USE sensordb;
'''
 
#(2)第二种方式创建数据库
#一个数据库,有多个数据表,默认自定义一个表名字

#---1数据库类的初始化-必须  database-数据库名字  table-数据表格名字
sql=Mysql(database="Database_1", table='Table_sensor1')
#---2-1创建唯一的数据库(已经存在就不执行)-必须
sql.sql_CreatDatabase()
#删除数据库-先打开后删除
#sql.delete_database(sql.database)
#---2-2连接数据库(此时并没有数据表)
sql.open_sql()
#---3-0创建数据表(已经存在就不执行)-必须
sql.creat_sqltable(sql.table)#表的名字
#---3-1删除数据表(清空数据)
#sql.delete_sqltable(sql.table)#表的名字


 
 
 
#---4-0查询所有
'''
results=sql.find_sql_ShowAll(sql.table)#查找
if len(results)!=0: 
    for row in results:
        print(row)    
        #idnum = row[0]
        #tname = row[1]
        #...
        #time=row[5]

return results
'''

cout=0

while 1:

    #4-1查找指定
    cout=cout+1
    finger_id=str(cout)
    finger_name="小舞"
    results,workmsg =sql.find_sql_finger(sql.table,finger_id)
    print("查询成功:",results,"    内容:",workmsg)

     
    #4-2插入数据,检查删除插入
    if results:
        print("数据已经存在,删除后替换")
        sql.delete_sql_finger(sql.table,finger_id)
        sql.insert_sql_finger(sql.table,finger_id, finger_name)#插入
    else:
        print("数据不存在,执行插入")
        sql.insert_sql_finger(sql.table,finger_id, finger_name)#插入
     
     
    time.sleep(5)
 
 
    #4-4改写数据
    #sql.change_sql(sql.table,'0001',"111111")
     
    #4-5删除数据
    #sql.delete_sql_finger(sql.table,"东东")
     
      
#5关闭数据库
#sql.close_sql()#关闭

  

3 测试例程 -多线程交互访问

# -*- coding: utf-8 -*-
  
#https://www.runoob.com/python3/python3-mysql.html
#https://blog.csdn.net/DKman803/article/details/1925326  保存中文

import time 
import pymysql
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
#使用前#1
import threading 
class Mysql():
      
    def __init__(self,
         host="127.0.0.1",
         user="root",
         password="admin",
         database="Database_1",  #数据库名字
         table='Table_sensor1',    #数据表名字
         charset='utf8',               
         port=3306):
          
        self.host = host
        self.port = port
        self.user = user
        self.password = password
        self.database = database
        self.table=table
        self.charset = charset
        self.conn = None
        self.cur = None


                   
    #1-0 创建数据库(如果存在不创建),然后链接数据库
    def sql_CreatDatabase(self):
        self.creat_spldatabase()
        #self.open_sql()#打开数据库

        

      
    #1-1创建数据库-没有数据表
    def creat_spldatabase(self):
        #最开始创建 区别于传建好的引用
        self.conn1 = pymysql.connect(host=self.host,
           port=self.port,
           user=self.user,
           password=self.password,
           charset=self.charset)
        self.cur1 = self.conn1.cursor()
        # 创建数据库的sql(如果数据库存在就不创建,防止异常)
        sql = f"CREATE DATABASE IF NOT EXISTS {self.database}"
        #sql = f"drop DATABASE if exists {self.database}"
        try:
            # 执行创建数据库的sql
            self.cur1.execute(sql)
            self.conn1.commit()
            self.cur1.close()
            self.conn1.close()
            print('数据库创建成功')
        except:
      
            print('创建失败')


    #1-2连接数据库-无数据表
    def open_sql(self):
       # print("连接已打开")
        self.conn = pymysql.connect(host=self.host,
                   port=self.port,
                   user=self.user,
                   password=self.password,
                   database=self.database,
                   charset=self.charset)
        self.cur = self.conn.cursor()

    #1-3删除数据库         
    def delete_database(self,DatabaseName):
        #DatabaseName=self.database
        try:
            sql = f"drop database if exists {DatabaseName}"
            self.cur.execute(sql)
            self.conn.commit()#保存结果
            print('删除数据库成功')
        except:
            self.conn.rollback()
            print('删除数据库失败')




         
    #2-1-1创建数据库中的数据表  
    # 表名字table_name   表结构  内部构造 
    def creat_sqltable(self,table_name):         
        sql = f'''
             create table IF NOT EXISTS {table_name}(
               #id int PRIMARY KEY NOT NULL auto_increment,  #自动增加int 如果后续这个插入数据ID相同就差不进去
               fingerID CHAR(20) not null,                      #指纹ID
               fingerName CHAR(20),                                 #指纹名字
               comment_time TIMESTAMP not NULL DEFAULT CURRENT_TIMESTAMP   #当前时间
              )default charset=utf8;
              '''
                                     
        self.cur.execute(sql)
        self.conn.commit()#保存结果
        #self.close_sql()

    #2-2删除数据库中的数据表
    def delete_sqltable(self,table_name):
        sql = f"drop table if exists {table_name}"
        self.cur.execute(sql)
        self.conn.commit()#保存结果
 
    #2-1-2创建数据库中的数据表  
    def creat_sqltable_ledinfo(self,table_name):         
        '''
        表名字-employee
        +------+------+----------------+------+
        | id   | ip |                   iphon          | TIMESTAMP  |
        +------+------+----------------+------+
        |  LED_A001 | 192.168.1.91  | 15529672865 | 2021/3/2    |
        +------+------+----------------+------+
        '''   
        sql = f'''
             create table IF NOT EXISTS {table_name}(
               #id int PRIMARY KEY NOT NULL auto_increment,  #自动增加int 如果后续这个插入数据ID相同就差不进去
               LED_ID CHAR(50) PRIMARY KEY NOT NULL,                       #led的编号
               LED_IP CHAR(50),                                            #led的IP地址  
               LED_ADDR_ID CHAR(50),                                       #led的所属区域ID编号
               LED_ADDR_SHOWNAME CHAR(255),                                #led的所属区域要显示的名字
               LED_ADDR_SHOWAllNum CHAR(30),                               #led的所属区域总车位
               LED_ADDR_SHOWSpareNum CHAR(30),                             #led的所属区域空闲车位
               comment_time TIMESTAMP not NULL DEFAULT CURRENT_TIMESTAMP   #插入时间记录
              )default charset=utf8;
              '''
                                     
        self.cur.execute(sql)
        self.conn.commit()#保存结果
         
    #2-1-3创建数据库中的数据表      
    def creat_sqltable_StudentPassWork(self,table_name):         
        '''
        表名字-employee
        +------+------+----------------+------+
        | id   | number | iphon          | TIMESTAMP  |
        +------+------+----------------+------+
        |    2 | Tom  | 15529672865 | 2021/3/2    |
        +------+------+----------------+------+
        '''   
        sql = f'''
             create table IF NOT EXISTS {table_name}(
               id int PRIMARY KEY NOT NULL auto_increment,  #自动增加int 如果后续这个插入数据ID相同就差不进去                           
               workId CHAR(255),                                    #作业ID
               studentname CHAR(30) not null,                      #学生名字char
               studentnumber CHAR(30) not null,                      #学生学号
               classname CHAR(30),                                 #课程名字char   
               teachername CHAR(30),                                 #老师名字char           
               comment_time TIMESTAMP not NULL DEFAULT CURRENT_TIMESTAMP   #插入时间记录
              )default charset=utf8;
              '''
                                     
        self.cur.execute(sql)
        self.conn.commit()#保存结果       


         
    #3关闭数据库
    def close_sql(self):
        # 提交到数据库执行
        self.conn.commit()
        
        self.cur.close()#数据库当前操作对象
        self.conn.close()#数据库连接
        print("数据库关闭")
         
         
    #4-1 插入数据  
    def insert_sql_finger(self,table_name,fingerID,fingerName):
        # SQL 插入语句
        #  id int PRIMARY KEY NOT NULL auto_increment,
        #  因为id是自动增长 所以不插入的话自动有 也可以手动查 但是不能一样       
        sql =f"insert into {table_name}(fingerID, fingerName) values ('%s','%s')" % (fingerID, fingerName)                             
        sql=sql.encode('utf8')  
        try:
           # 执行sql语句
           self.cur.execute(sql) 
           self.conn.commit()
           print('数据插入成功')
        except:
           # 如果发生错误则回滚
           self.conn.rollback()
           print('数据插入失败')
 
 
  
    #4-2-1 查找指定数据表全部数据         
    # table_name 数据表名字     
    def find_sql_ShowAll(self,table_name):
        # SQL 查询语句
        #self.cur.execute('SET CHARACTER SET utf8;')
        #self.cur.execute('SET character_set_connection=utf8;')
        sql =f"select * from {table_name}"
        #sql = "select * from employee where name = '%s'" % ('dongdong')
        #sql = "select * from employee where age > %d" % (18)
        #print(sql)
        try:
           # 执行SQL语句
           self.cur.execute(sql)
           # 获取所有记录列表
           results = self.cur.fetchall()
           #print('数据查询结果开始打印')
 
           if len(results)!=0: 
               for row in results:
                   print(row)    
                   #idnum = row[0]
                   #tname = row[1]
                   #...
                   #time=row[5]
            
           return results
           #print('数据查询结果打印完毕')
        except:
           print ("查询失败")
           self.conn.rollback()            
   
            
    #4-2-2 查找指定单个数据  
    # table_name 数据表名字
    # fingerID   要查询的内容
    def find_sql_finger(self,table_name,fingerID):
        # SQL 查询语句
        #sql =f"select * from {self.table}"
        sql = f"select * from {table_name} where fingerID in ('%s')" % (fingerID)
        #sql = "select * from employee where age > %d" % (18)
         
        try:
           # 执行SQL语句
           self.cur.execute(sql)
           # 获取所有记录列表
           results = self.cur.fetchall()
             
           if len(results)!=0:            
               for row in results:
                   print("查询指纹记录:"+str(row))    
                   #idnum = row[0]
                   #tname = row[1]
                   results=1
                   workmsg=row
           else:
               results=0
               workmsg=0
               print('没有查询到记录')
              
           return results,workmsg  
           #print('数据查询结果打印完毕')
        except:
           print ("查询错误")
           self.conn.rollback()  
             
             
  
 
 

    #4-3-1 修改数据表中指定数据


    def change_sql(self,table_name,num,iphon):    
        #修改查询条件的数据
         
        #sql = "update employee set age = age + 1 where sex = '%c'" % (sex)
        sql = f"update {table_name} set iphon = {iphon} where number = {num}"
        try:
            self.cur.execute(sql)
            print("修改成功:")
            self.conn.commit()
        except:
            self.conn.rollback()
            print('修改失败')
              

    #4-4-1 删除数据表中指定数据    
    # 
    #      
    def delete_sql_finger(self,table_name,fingerID):
        #删除查询条件的数据
        
        sql = f"delete from {table_name} where fingerID = '%s'" % (fingerID)
        sql=sql.encode('utf8')
        #sql = f"delete from {self.table} where age = 20"
        #sql = "delete from employee where passwd = '%s'" % ('123456')
        #print(sql)
        try:
            self.cur.execute(sql)
            self.conn.commit()
            print('删除成功')
            #self.conn.commit()
        except:
            self.conn.rollback()
            print('删除失败')
             

         
       
 


def mysql_use(canshu_id):

    #(2)第二种方式创建数据库
    #一个数据库,有多个数据表,默认自定义一个表名字

    #---1数据库类的初始化-必须  database-数据库名字  table-数据表格名字
    sql=Mysql(database="Database_1", table='Table_LED')
    #---2-1创建唯一的数据库(已经存在就不执行)-必须
    sql.sql_CreatDatabase()
    #删除数据库-先打开后删除
    #sql.delete_database(sql.database)
    #---2-2连接数据库(此时并没有数据表)
    sql.open_sql()
    #---3-0创建数据表(已经存在就不执行)-必须
    sql.creat_sqltable(sql.table)#表的名字

    #sql.creat_sqltable_ledinfo("LED_INFO")#创建LED信息表

    #---3-1删除数据表(清空数据)
    #sql.delete_sqltable(sql.table)#表的名字


 
 
    
    #---4-0查询所有
    '''
    results=sql.find_sql_ShowAll(sql.table)#查找
    if len(results)!=0: 
        for row in results:
            print(row)    
            #idnum = row[0]
            #tname = row[1]
            #...
            #time=row[5]
    '''



    cout=0

    while 1:

        #4-1查找指定
        cout=cout+1

        name = threading.current_thread().name #获取当前线程的名字

        if cout>10:

            return 

        #finger_id=str(cout)
        finger_name="车位:"+str(cout)
        #finger_name=canshu


     


        finger_id=canshu_id
        results,workmsg =sql.find_sql_finger(sql.table,finger_id)
        print(name,"查询成功:",results,"    内容:",workmsg)


        
        #4-2插入数据,检查删除插入
        if results:
            print("数据已经存在,删除后替换")
            sql.delete_sql_finger(sql.table,finger_id)
            sql.insert_sql_finger(sql.table,finger_id, finger_name)#插入
        else:
            print("数据不存在,执行插入")
            sql.insert_sql_finger(sql.table,finger_id, finger_name)#插入
        
        
        time.sleep(5)
    
    
        #4-4改写数据
        #sql.change_sql(sql.table,'0001',"111111")
        
        #4-5删除数据
        #sql.delete_sql_finger(sql.table,"东东")
        
        
    #5关闭数据库
    sql.close_sql()#关闭




#主函数
def main():
    threads = []
    #msg_name=["小舞","小红","小白"]
    msg_id=["LED_A001","LED_B002","LED_C003","LED_D004","LED_E005","LED_F006"]

    #for i in range(3):
    for inmae in msg_id:
        t = threading.Thread(target=mysql_use,args=(inmae,))
        t.start()
        threads.append(t)
    for t in threads:
        t.join()#等待线程执行完毕

main()

#>activate py37_tfgpu1131_keras215_opencv341

  

 

posted on 2021-08-22 15:00  MKT-porter  阅读(145)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3