我在使用postgres数据库的symfony2应用程序中遇到了doctrine2的问题。
我收到错误:
SQLSTATE[3F000]: Invalid schema name: 7 ERROR: schema "main" does not exist
问题是我的架构主要不是主要的。当我重命名它时,类似的事情发生在表关系中:
SQLSTATE[42P01]: Undefined table: 7 ERROR: relation "main.brand_brandid_seq" does not exist
问题是区分大小写,我想它可能与引用或某些学说配置有关。
实体:
namespace MyB\Entity;
/**
* MyB\Entity\Brand
*
* @orm:Table(name="Main.Brand")
* @orm:Entity
*/
class Brand
{
/**
* @var integer $brandid
*
* @orm:Column(name="BrandId", type="integer", nullable=false)
* @orm:Id
* @orm:GeneratedValue(strategy="SEQUENCE")
* @orm:SequenceGenerator(sequenceName="Main.Brand_BrandId_seq", allocationSize="1", initialValue="1")
*/
private $brandid;
/**
* @var string $brandname
*
* @orm:Column(name="BrandName", type="string", length=32, nullable=false)
*/
private $brandname;
/**
* Set name.
*
* @param string $name
*/
public function setName($name) {
$this->brandname = $name;
}
}
架构:
SET search_path = "Main", pg_catalog;
CREATE SEQUENCE "Brand_BrandId_seq"
START WITH 2
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;
SET default_tablespace = '';
SET default_with_oids = false;
CREATE TABLE "Brand" (
"BrandId" integer DEFAULT nextval('"Brand_BrandId_seq"'::regclass) NOT NULL,
"BrandName" character varying(32) NOT NULL
);
控制器:
$reseller = new \MyB\Entity\Brand();
$reseller->setName('Sasa');
$em = $this->get('doctrine.orm.entity_manager');
$em->persist($reseller);
$em->flush();
有什么想法吗?
答案 0 :(得分:4)
试试这个
namespace MyB\Entity;
/**
* MyB\Entity\Brand
*
* @orm:Table(name="""Main"".""Brand""")
* @orm:Entity
*/
class Brand
{
/**
* @var integer $brandid
*
* @orm:Column(name="""BrandId""", type="integer", nullable=false)
* @orm:Id
* @orm:GeneratedValue(strategy="SEQUENCE")
* @orm:SequenceGenerator(sequenceName="""Main"".""Brand_BrandId_seq""", allocationSize="1", initialValue="1")
*/
private $brandid;
/**
* @var string $brandname
*
* @orm:Column(name="""BrandName""", type="string", length=32, nullable=false)
*/
private $brandname;
/**
* Set name.
*
* @param string $name
*/
public function setName($name) {
$this->brandname = $name;
}
}
在postgres中,每个单词区分大小写都必须逃避。
答案 1 :(得分:1)
使用转义表名时要注意这个“错误”:https://github.com/doctrine/doctrine2/pull/615。 Doctrine将表名的第一个字符作为aliasprefix,因此使用了一个引用,破坏了所有的SQL
答案 2 :(得分:0)
我写了PpSqlBundle但它还没有完成,但你可以尝试,我认为它应该可行。 它可以生成与symfony相同的表单db。在config.yml中你应该:
doctrine:
dbal:
default_connection: default
connections:
default:
driver:
dbname:
host:
user:
password:
driverClass: PgSqlBundle\Doctrine\DBAL\Driver\PDOPgSql\Driver # it's important
logging:
你应该使用命令
app/console doctrine:mapping:import Yourbundlename annotation
答案 3 :(得分:0)
如果您在Laravel上使用迁移文件。将Schema :: table更改为Schema :: create。这可能对某人有所帮助。