sql >> データベース >  >> RDS >> PostgreSQL

値が長すぎて文字が変化しません(100)----最近切り替えられたデータベース、dbで何もしませんでした

    この問題を修正するのに助けが必要なのと同じくらい、この問題を修正するのに助けが必要だとは思いません。問題が明確になると、解決策も明確になります。トレースバックは、Djangoのソースコードを大量に処理していて、どのフィールドに問題があるのか​​がわからないため、おそらく少し不明確です。

    この問題の背景

    まず、Postの保存に問題があります 実例。モデル定義にあるこれらすべてのフィールドを見てください:

     ...
      url = models.URLField(max_length=250, blank=True, null=True)
      video = EmbedVideoField(verbose_name='link',help_text="Youtube", blank=True, null=True) 
      content = RichTextUploadingField(config_name='default')
      image = models.ImageField(upload_to='images',blank=True, null=True)
      thumbnail = models.ImageField(upload_to='images', blank=True, null=True)
    

    これらは次のように見えない テキストフィールドですが、それらの多くはテキストフィールドのバリエーションです。これは、考えてみると、おそらくファイル全体を保存することはないためです。 データベース内。代わりに行うこと(およびDjangoがデフォルトで行うこと)は、ファイルをディスクのどこかに保存してから、データベースにパスを保存することです。 そのファイルに追加して、必要なときに取得できるようにします。

    さらに、ファイルパスをLongTextとしてデータベースに保存するのはおそらく無駄です。 または何でも、すべてのFileField max_lengthのフィールドがあることを意味します 指定するかどうか。したがって、上記のすべてのフィールドには、暗黙のmax_lengthがあります。 。これは、Djangoのソースコードを読むことで実際に見つけることができます。

    ソースの例

    EmbedVideoFieldを使用したことはありません 、たとえば、 models.URLFieldのサブクラス 、つまりmax_length デフォルトでは、200に設定されています 指定しない場合。

    さらに、さまざまなImageField sはFileFieldの単なるサブクラスです 、 max_length デフォルトは100

    将来このような問題をデバッグする方法

    さて、これは私たちがどのを知るのに役立ちません この場合、フィールドの一部がエラーをスローしています。そのために、おそらくコードのどこかにブレークポイントを設定します。おそらくここにあります:

    File "ebagu/main/models.py" in save
       66.       super(Post, self).save(*args, **kwargs)
    

    「ブレークポイントを設定する」とは、次のことを意味します。

    上記のモジュールの65行目ebagu/main/models.pyに移動します。 次のように入力して、モジュールを保存します。import pdb; pdb.set_trace()

    (私は実際、ipdb> 私自身ですが、それにはIpythonが必要です。これも私が強く望んでいます...)

    ローカルサーバーを実行し、この問題が発生した手順を実行します。最終的にフォームを送信し、サーバーを起動したコンソールを見ると、最終的に65行目でシェルにダンプされます。このシェルはpdbシェル 、通常のシェルとはルールが異なりますが、保存しようとしているPostを評価できます。 インスタンス、インスタンス自体のさまざまなフィールドを確認することにより、self 、およびそのメソッド呼び出しのコンテキストでPythonコードを実行する:

    (pdb) len(self.image.path)
    

    それを使用して、さまざまなフィールドを手動で評価し、保存を妨げているこの非常に長いエントリ(おそらくImageFieldの1つ)を持っているフィールドを調べます。 s)。

    警告付きの解決策

    または、max_lengthを追加することもできます これらすべてに適用されますが、データベースの移行を実行する必要がある可能性が高いことに注意してください。 データベースが入力の長さを列の定義方法と照合するため、変更する限られたテキストフィールドに対して。 これがまさにこの問題を調べたStackOverflowの良い答えです

    脚注

    Postgresqlに切り替える前にこれが発生しなかったのはなぜですか?考えられる理由はさまざまですが、おそらく以前のデータベースの設定方法とPostgresqlデータベースの設定方法(手動での移行とDjangoの移行)に関係しています。

    また、これらのものが保存されている場所を変更したかどうかにも関係している可能性があります。 MEDIAを変更しましたか ファイルが保存されるパスが大幅に長くなるように設定しますか?

    あなたが本当にすべきことはあなたのデータベースを直接見ることです。 psqlを開きます インスタンスを作成し、テーブルについて説明するように依頼します。どのフィールドが100文字に制限されているかがわかり、それらが問題を引き起こすフィールドです。



    1. JUser ::_ load:ユーザーは3つのメインjoomlaテーブルすべてに存在しますが、ユーザーをロードできません

    2. MySQL:CASTは括弧の前にスペースを必要としませんか?

    3. 重複エントリの場合は特定のエントリを取得します

    4. MYSQL:メソッドと同様、類似した単語-ただし、検索された単語は表示しない