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