国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

記Flask-Migrate遷移數(shù)據(jù)庫失敗的兩個Bug——詳解循環(huán)導入問題

這篇具有很好參考價值的文章主要介紹了記Flask-Migrate遷移數(shù)據(jù)庫失敗的兩個Bug——詳解循環(huán)導入問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

記Flask-Migrate遷移數(shù)據(jù)庫失敗的兩個Bug——詳解循環(huán)導入問題,記錄,數(shù)據(jù)庫,flask,bug,python

Flask-Migrate遷移數(shù)據(jù)庫失敗的兩個Bug

1、找不到數(shù)據(jù)庫:Unknown database ‘***’

若還沒有創(chuàng)建數(shù)據(jù)庫,該遷移工具不會自動創(chuàng)建。你可以使用SQL命令手動創(chuàng)建一個數(shù)據(jù)庫:

create database <數(shù)據(jù)庫名稱>

2、遷移后沒有效果:No changes in schema detected.

我的情況長話短說,就是創(chuàng)建的數(shù)據(jù)模型類沒有注冊到程序實例app,解決方案是使用工廠函數(shù)。細說如下:

在項目的主目錄下,有兩個文件如下所示。我在app.py中創(chuàng)建了程序實例,在models.py中定義了數(shù)據(jù)模型類。flask會自動嘗試在名為app.py的文件中尋找程序實例,但不會管models.py文件,而我沒有在app.py中導入import models,這樣它就只是一個孤立的文件,和不存在沒啥區(qū)別。

- app.py
- models.py

解決方案

那我直接再app.py文件的頭部加一句import models不就行了?

  • /app.py
# import models
# 創(chuàng)建數(shù)據(jù)庫和程序實例
db = SQLAlchemy()
migrate = Migrate()

app = Flask(__name__)

# 注冊數(shù)據(jù)庫
db.init_app(app)
migrate.init_app(app, db)
  • /models.py
from app import db

class UserModel(db.Model):
    ...

答案是不行。因為如果這樣的話,from app import db會和import models構成循環(huán)導入,導致程序報錯。

不過我觀察到,有的項目中創(chuàng)建程序實例采用了工廠函數(shù)形式,同時并沒有發(fā)生循環(huán)導入的問題。即把app實例的創(chuàng)建過程代碼,從主流程轉移到一個函數(shù)中去,代碼如下所示:

工廠函數(shù):即返回值是一個可調(diào)用對象的函數(shù)。

# 創(chuàng)建數(shù)據(jù)庫實例
db = SQLAlchemy()
migrate = Migrate()

# 工廠函數(shù),返回實例對象
def create_app():
    app = Flask(__name__)
    ...
    db.init_app(app)
	migrate.init_app(app, db)
    # 導入數(shù)據(jù)模型
    import models
    
    return app

app = create_app()

循環(huán)導入的產(chǎn)生機制

改用工廠函數(shù),是我看了別人的代碼后,胡亂之下做的一個嘗試,它確實成功解決了問題??墒?,我們不免心生疑惑:

沒道理啊,為什么工廠函數(shù)就可以,我直接導入就不可以呢?

這就不得不仔細思考:”循環(huán)導入“這一問題發(fā)生的具體條件是什么?只是簡單的”A中導入了B,而在B中也導入了A“嗎?此時不妨回想一下,Python是一門解釋性語言,代碼是一行一行地執(zhí)行的。

而在models.py遇到導入語句from app import db時,是怎樣的機制呢?此時會跳轉到app.py,一行一行地執(zhí)行其中的代碼,直到找到對象db為止,然后返回繼續(xù)執(zhí)行原文件models.py中的代碼。

關于此機制我們不妨驗證一下,在同一目錄下創(chuàng)建兩個文件a.pyb.py如下。運行結果中輸出了"hello""world",卻沒有輸出"python",說明在完成 f 函數(shù)的定義后,a.py的執(zhí)行就停下來了,繼續(xù)執(zhí)行b.py中的代碼。

  • /a.py
print('hello')
def f():
    print('world')
print('python')
  • /b.py
from a import f
f()
  • python b.py命令的執(zhí)行結果:
hello
world

所以,前面發(fā)生循環(huán)導入的核心問題,其實只是因為**app.py中的import models語句放在了創(chuàng)建數(shù)據(jù)庫實例的db = SQLAlchemy()語句之前。** 我們只需要將import models語句放到后面,完全不需要包裝一層工廠函數(shù),就可以解決這個問題。文章來源地址http://www.zghlxwxcb.cn/news/detail-670066.html


到了這里,關于記Flask-Migrate遷移數(shù)據(jù)庫失敗的兩個Bug——詳解循環(huán)導入問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • EF命令行工具 migrate.exe 進行Code First更新數(shù)據(jù)庫,6.3+使用ef6.exe

    使用EF的Code First遷移可以用于從Visual Studio內(nèi)部更新數(shù)據(jù)庫,但也可通過命令行工具 migrate.exe 進行執(zhí)行。 如果項目已經(jīng)更新到服務器,后面的更新數(shù)據(jù)庫分為兩種辦法,要么把線上數(shù)據(jù)庫備份到本地,然后使用VS遷移,要么使用命令遷移,官方提供了migrate.exe工具,命令如下,

    2024年02月04日
    瀏覽(22)
  • 【數(shù)據(jù)庫遷移系列】從MySQL到openGauss的數(shù)據(jù)庫對象遷移實踐

    【數(shù)據(jù)庫遷移系列】從MySQL到openGauss的數(shù)據(jù)庫對象遷移實踐

    在之前這一篇中我們分享過使用chameleon工具完成MySQL到openGauss的全量數(shù)據(jù)復制、實時在線復制。9.30新發(fā)布的openGauss 3.1.0版本 ,工具的全量遷移和增量遷移的性能不但有了全面提升,而且支持數(shù)據(jù)庫對象視圖、觸發(fā)器、自定義函數(shù)、存儲過程的遷移。 本篇就來分享一下使用c

    2024年02月02日
    瀏覽(38)
  • 數(shù)據(jù)庫遷移之mysql到達夢數(shù)據(jù)庫

    數(shù)據(jù)庫遷移之mysql到達夢數(shù)據(jù)庫

    由于業(yè)務需求要求數(shù)據(jù)庫國產(chǎn)化,因此將數(shù)據(jù)從mysql數(shù)據(jù)庫中遷移到國產(chǎn)達夢數(shù)據(jù)庫中。將mysql中的每個庫遷移到達夢不同模式下,下面為詳細過程。 (1)安裝達夢客戶端工具 (2)點擊選擇DM管理工具 (3)創(chuàng)建模式和用戶 在用戶菜單中,新建一個TEST模式以及相應的用戶。

    2024年02月08日
    瀏覽(35)
  • Flask數(shù)據(jù)庫之SQLAlchemy--介紹--鏈接數(shù)據(jù)庫

    Flask數(shù)據(jù)庫之SQLAlchemy--介紹--鏈接數(shù)據(jù)庫

    目錄 SQLAlchemy介紹 SQLAlchemy連接數(shù)據(jù)庫? 數(shù)據(jù)庫是一個網(wǎng)站的基礎?。?! 比如MySQL、MongoDB、SQLite、PostgreSQL等,這里我們以MySQL為例進行講解。 SQLAlchemy是一個ORM框架 對象關系映射 (英語: Object Relational Mapping ,簡稱 ORM ,或 O/RM ,或 O/R mapping ),是一種程序設計技術,用于實

    2024年02月07日
    瀏覽(28)
  • mysql數(shù)據(jù)庫遷移

    mysql數(shù)據(jù)庫遷移

    公司有個項目,剛開始數(shù)據(jù)量不是大的時候,數(shù)據(jù)庫和服務上的所有應用數(shù)據(jù)都放在一個舊小盤中,隨著項目數(shù)據(jù)的增長,舊的磁盤被占滿了,導致系統(tǒng)無法寫入數(shù)據(jù),我和同事排查了很長時間,最終確定是磁盤被占滿導致的一系列連鎖問題。問題找到了,接下來就是想辦法

    2024年02月14日
    瀏覽(27)
  • mysql數(shù)據(jù)庫數(shù)據(jù)如何遷移目錄

    mysql數(shù)據(jù)庫數(shù)據(jù)如何遷移目錄

    默認位置 C:ProgramDataMySQLMySQL Server 8.0 步驟2中Data文件夾就是mysql存放數(shù)據(jù)的位置 這里舉例移動到E盤下 原來my.ini文件不要修改文件位置,如果修改需要另行學習

    2024年02月07日
    瀏覽(101)
  • Django dumpdata 遷移數(shù)據(jù)庫數(shù)據(jù)

    本文介紹兩種常用的 Django 服務遷移數(shù)據(jù)方法。 這兩種方法都需要在新的服務器部署好數(shù)據(jù)庫,創(chuàng)建好相應的數(shù)據(jù)庫表和用戶以后再進行。 針對數(shù)據(jù)量不是很大的項目,可以使用此方法,操作起來比較簡單。 通過連接舊的數(shù)據(jù)庫運行dumpdata導出命令導出數(shù)據(jù)。 連接上新的數(shù)

    2024年02月17日
    瀏覽(23)
  • Django遷移數(shù)據(jù)到指定數(shù)據(jù)庫

    在Django中,你可以配置多個數(shù)據(jù)庫,并且可以為不同的操作指定使用不同的數(shù)據(jù)庫。這意味著你確實可以同時將數(shù)據(jù)保存到SQLite和MySQL數(shù)據(jù)庫中,但這需要你在代碼中明確指定每次數(shù)據(jù)庫操作應使用哪個數(shù)據(jù)庫。 首先,你需要在Django設置文件 settings.py 中定義兩個數(shù)據(jù)庫連接,

    2024年02月01日
    瀏覽(17)
  • RDS-sql server使用DTS進行數(shù)據(jù)庫遷移,同阿里云賬號RDS數(shù)據(jù)庫遷移

    目錄 RDS-sql server使用DTS進行數(shù)據(jù)庫遷移,同阿里云RDS數(shù)據(jù)庫遷移 背景: 環(huán)境調(diào)研: 問題: 1:OA程序文件如何遷移? 2:RDS-sql server數(shù)據(jù)庫文件如何遷移? 遷移思路: 失敗思路總結: 遷移過程: 1:OA程序文件遷移 2:數(shù)據(jù)庫文件遷移 2.1 使用OSS桶恢復

    2024年02月09日
    瀏覽(26)
  • 如何遷移MySQL數(shù)據(jù)庫?

    遷移MySQL數(shù)據(jù)庫可以采取多種方法,以下是其中幾種常用的方法: 備份和還原:將原有的MySQL數(shù)據(jù)庫備份到一個文件中,然后將備份文件還原到新的MySQL服務器中。具體來說,可以使用mysqldump命令進行備份,使用mysql命令進行還原。例如,備份一個名為mydb的數(shù)據(jù)庫可以使用以下

    2024年02月09日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包