场景:
在本地调试代码,没有问题,移植到linux上,sqlalchemy报错
Table 'blog.Users' doesn't exist
对比模型中代码:(只截取了部分)
class Users(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
articlecate = db.relationship('ArticleCate', backref='category_of_user')
picturecate = db.relationship('PictureCate', backref='category_of_user')
articles = db.relationship('Article', backref='art_of_user')
pictures = db.relationship('Picture', backref='pic_of_user')
__tablename__ = 'Users'
推断:
在linux下需要严格大小写?linux怎么会影响到sqlalchemy和数据库?——只可能影响到数据库版本!
测试:
windows下
> select * from Users;
> select * from users;
都执行成功
linux下
> select * from Users;
成功
> select * from users;
> Table 'blog.users' doesn't exist
明显,是数据库问题,去查看windows和linux下版本,一致
上网搜索关于数据库的大小写问题,发现是参数控制着mysql对大小写的敏感
mysql> show variables like "%case%";
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_file_system | OFF |
| lower_case_table_names | 0 |
+------------------------+-------+
2 rows in set (0.00 sec)
lower_case_file_system
该参数是用于描述data目录所在的操作系统是否为大小写敏感,该参数为bool类型,但无法修改。
0 -- 大小写敏感
1 -- 大小写不敏感
比如跑在linux上的都是OFF或者0。
lower_case_table_names
该参数为静态,可设置为0、1、2。
0 -- 大小写敏感。(Unix,Linux默认)
创建的库表将原样保存在磁盘上。如create database TeSt;将会创建一个TeSt的目录,create table AbCCC ...将会原样生成AbCCC.frm。
SQL语句也会原样解析。
1 -- 大小写不敏感。(Windows默认)
创建的库表时,MySQL将所有的库表名转换成小写存储在磁盘上。
SQL语句同样会将库表名转换成小写。
如需要查询以前创建的Test_table(生成Test_table.frm文件),即便执行select * from Test_table,也会被转换成select * from test_table,致使报错表不存在。
2 -- 大小写不敏感(OS X默认)
创建的库表将原样保存在磁盘上。
但SQL语句将库表名转换成小写。
解决:
修改/etc/my.cnf
添加 lower_case_table_names = 1
进入数据库
mysql> show variables like "%case%";
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_file_system | OFF |
| lower_case_table_names | 1 |
+------------------------+-------+
2 rows in set (0.00 sec)
select * from users;
ERROR 1146 (42S02): Table 'blog.users' doesn't exist
???怎么回事,哦,可能是之前是区别大小写的,而表名现在是大写,修改一下表名
alter table Users rename users;
ERROR 1146 (42S02): Table 'blog.users' doesn't exist
我***
网搜解决方案
1)先在my.cnf里将lower_case_table_names参数再次调整为0,改成区分大小写
2)然后mysqladmin -uroot -p shutdown 以安全模式关闭数据库,再重启
3)登陆mysql数据库,"alter table 旧表名 rename 新表名" 将带大写字母的旧表改为小写表名
4)最后再启动mysql即可!
再测试,已经可以大小写搜索,解决~~
总结,对于已经构建好的业务体系,还是不能这样一个个改,只能搞清楚数据库的兼容问题,严格参照旧的代码,扩展业务
参考资料:
linux公社:https://www.linuxidc.com/Linux/2018-01/150696.htm
csnd:https://www.cnblogs.com/kevingrace/p/6150748.html
网友评论