1

symfony2 と postgres に問題があります。変更できない大文字のテーブルとシーケンスを含むデータベースがあります。

エンティティを生成し (リバース エンジニアリング)、識別子を引用し、何らかの種類の変更 (php app/console doctrine:schema:update --force) を実行しようとすると、次のエラーが返されます。

[PDOException] SQLSTATE[42P01]: 未定義のテーブル: 7 エラー: 関連する «base_id_se q» は存在しません LINE 1: SELECT min_value, increment_by FROM BASE_id_seq

私の基本エンティティのコードは次のとおりです。

namespace Slip\CoreBundle\Entity;

use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Slip\ContactBundle\Entity\Criterion;
/**
 * Slip\CoreBundle\Entity\Base
 *
 * @ORM\Entity(repositoryClass="Slip\CoreBundle\Repository\BaseRepository")
 * @ORM\Table(name="""BASE""")
 */
class Base
{
    /**
     * @var bigint $id
     * 
     * @ORM\Column(name="id", type="bigint", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="SEQUENCE")
     * @ORM\SequenceGenerator(sequenceName="""BASE_id_seq""", allocationSize=1, initialValue=1)
     */
    private $id;
    /**
     * @var string $name
     * @ORM\Column(name="name", type="string", length=1024, nullable=false)
     */
    private $name;

…………

シーケンスの名前をすべて小文字に変更すると、変更がデータベースに適用されますが、本番環境では実行できません

データベースに変更を加えると、BASE テーブル以外のテーブルにこのエラーが表示される理由がわかりません。

ご協力ありがとうございます。

4

1 に答える 1

1

率直に言って、Symfony は PostgreSQL に送信する SQL の識別子を引用していません。これは、SQL トレースを取得することで確認できます。log_statementのドキュメントを参照してください。SQL Server 以外の DBMS と同様に、引用符で識別子を作成した場合は、それらを参照する後続のすべての SQL でそれらの識別子を引用する必要があります。

私は Symfony について何も知りませんが、おそらく、引用符で囲まれた識別子の使用を強制するか、少なくとも手動で識別子名に引用符を強制することを許可するオプションがあります。

そうでなく、PROD テーブルに触れることができない場合は、窮地に立たされています。PostgreSQL では、更新可能なビューのサポートが限定されているようです。ビューとルールを組み合わせて目的を達成できるかもしれませんが、それは醜い可能性があります。最初に Symfony のアプローチを試してください。

于 2012-07-10T20:44:08.947 に答える