場(chǎng)景:
在本地調(diào)試代碼,沒(méi)有問(wèn)題,移植到linux上,sqlalchemy報(bào)錯(cuò)
Table 'blog.Users' doesn't exist
對(duì)比模型中代碼:(只截取了部分)
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下需要嚴(yán)格大小寫(xiě)?linux怎么會(huì)影響到sqlalchemy和數(shù)據(jù)庫(kù)?——只可能影響到數(shù)據(jù)庫(kù)版本!
測(cè)試:
windows下
> select * from Users;
> select * from users;
都執(zhí)行成功
linux下
> select * from Users;
成功
> select * from users;
> Table 'blog.users' doesn't exist
明顯,是數(shù)據(jù)庫(kù)問(wèn)題,去查看windows和linux下版本,一致
上網(wǎng)搜索關(guān)于數(shù)據(jù)庫(kù)的大小寫(xiě)問(wèn)題,發(fā)現(xiàn)是參數(shù)控制著mysql對(duì)大小寫(xiě)的敏感
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
該參數(shù)是用于描述data目錄所在的操作系統(tǒng)是否為大小寫(xiě)敏感,該參數(shù)為bool類(lèi)型,但無(wú)法修改。
0 -- 大小寫(xiě)敏感
1 -- 大小寫(xiě)不敏感
比如跑在linux上的都是OFF或者0。
lower_case_table_names
該參數(shù)為靜態(tài),可設(shè)置為0、1、2。
0 -- 大小寫(xiě)敏感。(Unix,Linux默認(rèn))
創(chuàng)建的庫(kù)表將原樣保存在磁盤(pán)上。如create database TeSt;將會(huì)創(chuàng)建一個(gè)TeSt的目錄,create table AbCCC ...將會(huì)原樣生成AbCCC.frm。
SQL語(yǔ)句也會(huì)原樣解析。
1 -- 大小寫(xiě)不敏感。(Windows默認(rèn))
創(chuàng)建的庫(kù)表時(shí),MySQL將所有的庫(kù)表名轉(zhuǎn)換成小寫(xiě)存儲(chǔ)在磁盤(pán)上。
SQL語(yǔ)句同樣會(huì)將庫(kù)表名轉(zhuǎn)換成小寫(xiě)。
如需要查詢以前創(chuàng)建的Test_table(生成Test_table.frm文件),即便執(zhí)行select * from Test_table,也會(huì)被轉(zhuǎn)換成select * from test_table,致使報(bào)錯(cuò)表不存在。
2 -- 大小寫(xiě)不敏感(OS X默認(rèn))
創(chuàng)建的庫(kù)表將原樣保存在磁盤(pán)上。
但SQL語(yǔ)句將庫(kù)表名轉(zhuǎn)換成小寫(xiě)。
解決:
修改/etc/my.cnf
添加 lower_case_table_names = 1
進(jìn)入數(shù)據(jù)庫(kù)
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
???怎么回事,哦,可能是之前是區(qū)別大小寫(xiě)的,而表名現(xiàn)在是大寫(xiě),修改一下表名
alter table Users rename users;
ERROR 1146 (42S02): Table 'blog.users' doesn't exist
我***
網(wǎng)搜解決方案
1)先在my.cnf里將lower_case_table_names參數(shù)再次調(diào)整為0,改成區(qū)分大小寫(xiě)
2)然后mysqladmin -uroot -p shutdown 以安全模式關(guān)閉數(shù)據(jù)庫(kù),再重啟
3)登陸mysql數(shù)據(jù)庫(kù),"alter table 舊表名 rename 新表名" 將帶大寫(xiě)字母的舊表改為小寫(xiě)表名
4)最后再啟動(dòng)mysql即可!
再測(cè)試,已經(jīng)可以大小寫(xiě)搜索,解決~~
總結(jié),對(duì)于已經(jīng)構(gòu)建好的業(yè)務(wù)體系,還是不能這樣一個(gè)個(gè)改,只能搞清楚數(shù)據(jù)庫(kù)的兼容問(wèn)題,嚴(yán)格參照舊的代碼,擴(kuò)展業(yè)務(wù)
參考資料:
linux公社:https://www.linuxidc.com/Linux/2018-01/150696.htm
csnd:https://www.cnblogs.com/kevingrace/p/6150748.html