• python操作数据库


    https://blog.csdn.net/huayucong/article/details/49736427
    https://blog.csdn.net/yiibai/article/details/73769982?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2
    https://www.runoob.com/python3/python3-mysql.html

    https://www.jb51.net/article/168986.htm

    1. 安装MySQL
    使用管理员权限运行apt-get获取最新的MySQL及Python编程接口(之后用于数据库编程):

    $ sudo apt-get install mysql-server python-mysqldb

    # -*- coding: utf-8 -*-
    
    #https://www.runoob.com/python3/python3-mysql.html
    #https://blog.csdn.net/DKman803/article/details/1925326  保存中文
    
    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
            
          
     
        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()
        
        #只修改数据库名字
        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('创建失败')
        
        #只修改数据库名字
        def delete_sqltable(self):
            sql = f"drop table if exists {self.table}"
            self.cur.execute(sql)
            self.conn.commit()#保存结果
           
           
        def creat_sqltable(self):           
            '''
            表名字-employee
            +------+------+----------------+------+
            | id   | name | class          | age  |
            +------+------+----------------+------+
            |    2 | Tom  | 3 year 1 class | 9    |
            +------+------+----------------+------+
            '''     
            sql = f'''
                 create table IF NOT EXISTS {self.table}(
                   id int PRIMARY KEY NOT NULL auto_increment,  #自动增加int 如果后续这个插入数据ID相同就差不进去
                   number CHAR(20) not null,                      #老师名字char
                   iphon CHAR(20),                                 #课程名字char
                   comment_time TIMESTAMP not NULL DEFAULT CURRENT_TIMESTAMP   #当前时间
                  )default charset=utf8;
                  '''
                                       
            self.cur.execute(sql)
            self.conn.commit()#保存结果
         
         #创建数据库和数据表 如果存在不创建
        def sql_creat_database_tabale_doonce(self):
            self.creat_spldatabase()
            self.open_sql()#打开数据库
            #3创建数据库中的数据表
            self.creat_sqltable()
            self.close_sql()
        
        def insert_sql(self,number,iphon):
            # SQL 插入语句
            #  id int PRIMARY KEY NOT NULL auto_increment,
            #  因为id是自动增长 所以不插入的话自动有 也可以手动查 但是不能一样         
            sql =f"insert into {self.table}(number, iphon) values ('%s','%s')" % (number, iphon)                               
            sql=sql.encode('utf8')    
            try:
               # 执行sql语句
               self.cur.execute(sql)   
               self.conn.commit()
               print('数据插入成功')
            except:
               # 如果发生错误则回滚
               self.conn.rollback()
               print('数据插入失败')
               
        def find_sql_iphon(self,num):
            # SQL 查询语句
            #sql =f"select * from {self.table}"
            sql = f"select * from {self.table} where number in ('%s')" % (num)
            #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=row[2]
               else:
                   results=0
                   print('没有查询到记录')
                
               return results    
               #print('数据查询结果打印完毕')
            except:
               print ("查询错误")
               self.conn.rollback()
               
               
        def find_sql_one(self,num):
            # SQL 查询语句
            #sql =f"select * from {self.table}"
            sql = f"select * from {self.table} where number in ('%s')" % (num)
            #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
               else:
                   results=0
                   print('没有查询到记录')
                
               return results    
               #print('数据查询结果打印完毕')
            except:
               print ("查询错误")
               self.conn.rollback()           
               
        def find_sql(self):
            # SQL 查询语句
            #self.cur.execute('SET CHARACTER SET utf8;')
            #self.cur.execute('SET character_set_connection=utf8;')
            sql =f"select * from {self.table}"
            #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('数据查询结果开始打印')
               for row in results:
                   print(row)      
                   idnum = row[0]
                   tname = row[1]
                  
                   #time=row[5]
                   # 打印结果
                  
                   #print ("编号=%s,老师姓名=%s,课程名称=%s,班级名称=%s,性别=%s,time=%s"% 
                         #(idnum, tname, kname, cname, sex ,time))
               return results
               #print('数据查询结果打印完毕')
            except:
               print ("查询失败")
               self.conn.rollback()
       
        def change_sql(self,num,iphon):      
            #修改查询条件的数据
           
            #sql = "update employee set age = age + 1 where sex = '%c'" % (sex)
            sql = f"update {self.table} set iphon = {iphon} where number = {num}" 
            try:
                self.cur.execute(sql)
                print("修改成功:")
                self.conn.commit()
            except:
                self.conn.rollback()
                print('修改失败')
                
        def delete_sql(self,number):
            #删除查询条件的数据
          
            sql = f"delete from {self.table} where number = '%s'" % (number)
            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 close_sql(self):
            # 提交到数据库执行
            self.conn.commit()
            self.cur.close()
            self.conn.close()
    
    #1-1第一种方式创建数据库
    '''
    命令行-命令后续结尾分号
    mysql -u root -p
    输入密码 admin
    查看当前数据库
    SHOW DATABASES;
    创建新的数据库
    creat database sensorb;
    重新查看是否成功
    SHOW databases;
    使用数据库
    USE sensordb;
    '''
    
    '''
    #第二种方式创建数据库
    #1-2连接现有数据库
    sql=Mysql()
    sql.creat_spldatabase()
    sql.open_sql()#打开数据库
    #3创建数据库中的数据表
    sql.creat_sqltable()
    '''
    
    
    #-----上述代码必须执行一次以后不用执行,完成基本创建-----
    
    #1数据库类的初始化-必须
    sql=Mysql(database="Database_1", table='Table_sensor1')
    #2创建数据库和数据表(已经存在就不执行)-必须
    sql.sql_creat_database_tabale_doonce()
    #3连接数据库(没有数据表)
    sql.open_sql()
    #4-1删除数据表(清空数据)
    #sql.delete_sqltable()
    
    #4-1插入数据
    #sql.insert_sql("0002", '15529672863')#插入
    
    #4-2查找指定
    #b=sql.find_sql_one("0001")
    #print(b)
    #4-3查询所有
    sql.find_sql()#查找
    #4-4改写数据
    #sql.change_sql('0001',"111111")
    #4-5删除数据
    #sql.delete_sql("0002")
    #sql.find_sql()#查找
    
    #5关闭数据库
    #sql.close_sql()#关闭
    

      

     界面配合显示

    #!/usr/bin/env python3
    # -*- coding:utf-8 -*-
    from guizero import *
    import os
     
     
    #使用数据库获取信息
    from sql import Mysql
    sql=Mysql()#初始化
    sql.sql_creat_database_tabale_doonce()#创建数据库和数据表
    sql.open_sql()#打开数据库
    
     
    #类
    class Gui_sql:
         
        def __init__(self):
            
            pass 
        #----------------------------------------------
        
        #从数据库读取信息显示在显示界面   
        def read_jilu_imag(self):
            results=sql.find_sql()#查找所有记录
            for row in results:
                self.input_box.append(str(row))# 去掉文件格式名字  
           
        #跟新数据记录
        def refresh(self):
            self.input_box.clear()
            self.input_box.append("--------报警数据库---------")
            self.input_box.append("--------------------------")
            self.input_box.append("-序列号-报警信息-数值-时间-")
            self.input_box.append("--------------------------")    
            self.read_jilu_imag()
            
        def delete(self):
            #sql.delete_sql("烟雾报警")#删除制定数据
            sql.delete_sqltable()#删除整个数据表
            sql.sql_creat_database_tabale_doonce()#重新创建
            sql.open_sql()#打开数据库
            self.refresh()
            
        #1主界显示记录     
        def set_gui(self):
             
            #创建窗口  标题
            self.app=App(layout="grid",title="消防报警系统",width=580, height=450)
            #列表控件
            self.input_box = TextBox(self.app, grid=[0,0,2,1],text="--------------------------", height="fill", width="fill",multiline=True, scrollbar=True) 
            
            #列表控件加入数值
            self.input_box.append("--------报警数据库---------")
            self.input_box.append("--------------------------")
            self.input_box.append("-序序列号-报警信息-数值-时间-")
            self.input_box.append("--------------------------")    
            #读取数据库并加入列表显示
            self.read_jilu_imag()
            #刷新按钮
            self.remove_button = PushButton(self.app, grid=[1,1],command=self.delete,text="清空")
            self.brash_button = PushButton(self.app, grid=[0,1],command=self.refresh,text="刷新")
            
            self.app.display()
             
    gui_main=Gui_sql()
    gui_main.set_gui()
    

      

      

    MySQL建表,设置字段自动获取当前时间

    https://blog.csdn.net/ning734824592/article/details/84724799

    CREATE TABLE comment_user (
    user_account VARCHAR (60),
    user_name VARCHAR (60),
    [color=red]comment_content VARCHAR (500),
    comment_time TIMESTAMP not NULL DEFAULT CURRENT_TIMESTAMP
    );

    https://blog.csdn.net/qq_36523839/article/details/80638663?depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1

    完美解决mysql保存中文出现1366错误

    最近在使用sqlalchemy将中文存放至mysql数据库的表中时出现:

    Warning Code :1366 Incorrect string value: 'xE5x9CxA8' for column 'content' at row 1

    这是因为我们存放的中文,而我们的表并不支持中文字符集,使用 show variables like 'character%'; 查看mysql当前编码:

     

    以看出database和server的字符集使用的是latin1,latin1是不支持中文的,导致存放中文错误。

    我尝试了两种方法来避免中文存放错误问题:

    1:设置server和database为utf8类型

    使用以下命令来设置在命令行输入:

        show variables like '%char%';
        set character_set_server=utf8;
        set character_set_database=utf8;

    一般使用上面的命令就可以了,如果还不行,show create table 表名;,看看具体的column是不是字符集不对。

    2:建表时设置默认字符集

    我在建表时一般会在sql语句中设置默认字符集为utf8,来避免一些问题:


    在末尾添加default charset=utf8,来设置就好了,如果还需要设置其他的参数,也可以直接在sql语句的末尾添加。

    sql=sql.encode('utf8')编码问题

    self.cur.execute("set names 'utf8'")
    sql =f"insert into {self.table}(name, passwd, age, sex) values ('%s','%s', '%s', '%s')"
    %("小甜甜", '123456', 20, 'M')
    #sql=sql.encode('utf8')

  • 相关阅读:
    vue内置指令与自定义指令
    javascript全局方法与变量
    javascript继承
    promise对象
    javascript函数节流(throttle)与函数去抖(debounce)
    Mysql Explain 解读(基于MySQL 5.6.36)
    Mycat之日志分析跨分片事务以及存储过程的执行过程
    Mycat之日志分析 select * from travelrecord order by id limit 100000,100 的执行过程
    Mycat实战之离散分片
    Mycat实战之连续分片
  • 原文地址:https://www.cnblogs.com/kekeoutlook/p/12778831.html
Copyright © 2020-2023  润新知