美文网首页
关于sqlalchemy在linux上的一个坑

关于sqlalchemy在linux上的一个坑

作者: 小龙虾0o0 | 来源:发表于2019-04-09 10:02 被阅读0次

场景:

在本地调试代码,没有问题,移植到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

相关文章

网友评论

      本文标题:关于sqlalchemy在linux上的一个坑

      本文链接:https://www.haomeiwen.com/subject/iusviqtx.html