關(guān)于sqlalchemy在linux上的一個(gè)坑

場(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容