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')

原文地址:https://www.cnblogs.com/kekeoutlook/p/12778831.html