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
);
完美解决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')