Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在自动映射在SqlAlchemy中创建类之后,是否可以声明关系_Python_Mysql_Sqlalchemy_Relationship_Automap - Fatal编程技术网

Python 在自动映射在SqlAlchemy中创建类之后,是否可以声明关系

Python 在自动映射在SqlAlchemy中创建类之后,是否可以声明关系,python,mysql,sqlalchemy,relationship,automap,Python,Mysql,Sqlalchemy,Relationship,Automap,我是炼金术新手。我按照教程创建了现有数据库的自动映射,并从mysql数据库建立了关系 from sqlalchemy import create_engine, MetaData, Column, Table, ForeignKey from sqlalchemy.ext.automap import automap_base, generate_relationship from sqlalchemy.orm import relationship, backref from config i

我是炼金术新手。我按照教程创建了现有数据库的自动映射,并从mysql数据库建立了关系

from sqlalchemy import create_engine, MetaData, Column, Table, ForeignKey
from sqlalchemy.ext.automap import automap_base, generate_relationship
from sqlalchemy.orm import relationship, backref
from config import constr, mytables

def _gen_relationship(base, direction, return_fn,
                  attrname, local_cls, refferred_cls, **kw):
    return generate_relationship(base, direction, return_fn, attrname, local_cls, refferred_cls, **kw)

engine = create_engine(constr)
metadata = MetaData()
metadata.reflect(engine, only=mytables)
Base = automap_base(metadata=metadata)
Base.prepare(engine, reflect=True, generate_relationship=_gen_relationship)
Tableclass1 = Base.classes.table1
Tableclass2 = Base.classes.table2
Table2.ID
映射到
table1
的一列。但是,当我尝试使用query和join
table1
table2
时,它报告错误,说“找不到任何外键关系”。既然我知道这两个表之间的关系,有没有办法在创建类实例后声明这个关系?或者有没有办法在查询函数中显式地说明这种关系?
谢谢

您可以通过使用join-SQLAlchemy的
join
方法的
onclause
paremeter显式地实现这一点。
onclause
参数的用法与SQL的连接类似,例如

sqlalchemy.orm.join(table1, table2, onclause=table2.ID == table1.your_attribute)
您也可以通过简单地在类中声明外键来绕过数据库中外键的存在:

Column('ID', Integer, ForeighKey('table1.your_attribute'))

虽然可以在@mpolednik提到的查询中这样做,但如果我正确阅读了您的问题,理想的解决方案是在类中声明关系以供重复使用

只需预先声明要使用的类即可实现,如下所示:

from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import Session, relationship
from sqlalchemy import create_engine, Column, String

Base = automap_base()

engine = create_engine("postgresql://user:pass@localhost:5432/mydb")

# pre-declare User for the 'user' table
class User(Base):
    __tablename__ = 'user'

    # override schema elements like Columns
    oname = Column('originalname', String)

    # and a relationship. I name it 'weird' because in my database schema
    # this relationship makes absolutely no sense, but it does demonstrate
    # the point
    weird = relationship("usergroup",
                         foreign_keys='usergroup.id',
                         primaryjoin='and_(usergroup.id==User.id)')

Base.prepare(engine, reflect=True)
session = Session(engine)

# Test this by querying the User table and then following the relationship
u = session.query(User).filter(User.oname == 'testuser').one()
print (u.oname)
for g in u1.weird:
    print g.name
有关文档(包括另一个示例),请参见此处: