2013-05-15 43 views
5

Tôi đang cố gắng để làm một cross-cơ sở dữ liệu tham gia Flask-SQLAlchemy:Cross-cơ sở dữ liệu tham gia Flask-SQLAlchemy

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = '...Master...' 
app.config['SQLALCHEMY_BINDS'] = { 'Billing': '...Billing...' } 
db = SQLAlchemy(app) 

class Account(db.Model): 
    __tablename__ = 'Accounts' 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(255)) 

class Setting(db.Model): 
    __tablename__ = 'Settings' 
    AccountId = db.Column(db.Integer, db.ForeignKey(Account.id), primary_key=True) 
    Enabled = db.Column(db.Boolean) 

class BillingAccount(db.Model): 
    __tablename__ = 'Account' 
    __bind_key__ = 'Billing' 
    id = db.Column(db.Integer, primary_key=True) 
    AccountId = db.Column(db.Integer, db.ForeignKey(Account.id)) 
    currency = db.Column(db.Integer) 

class AccountSetting(db.Model): 
    __table__ = db.join(Account, AccountSetting) 
    id = db.column_property(Account.id, AccountSetting.AccountId) 
    username = Account.username 
    enabled = Setting.Enabled 

class AccountSettingBilling(db.Model): 
    __table__ = db.join(Account, AccountSetting).join(BillingAccount) 

    id = db.column_property(Account.id, AccountSetting.AccountId, BillingAccount.AccountId) 
    username = Account.username 
    enabled = Setting.Enabled 
    currency = BillingAccount.currency 

Với điều này tôi thành công có thể truy vấn AccountSetting.query.all() nhưng không AccountSettingBilling .query.all(), lỗi với lỗi 208 (MSSQL cho 'đối tượng không tồn tại').

Nếu tôi kiểm tra SQL được tạo, tôi có thể thấy rõ ràng rằng nó đang thực hiện JOIN trên Account.AccountId = Accounts.id khi tôi muốn thấy một số tham chiếu đến Thanh toán, ví dụ: Billing.Account.AccountId = Accounts.id.

Sau khi theo dõi Cross database join in sqlalchemyhttp://pythonhosted.org/Flask-SQLAlchemy/binds.html, có vẻ như tôi đã làm mọi thứ một cách chính xác. Đưa cái gì?

Trả lời

1

Bạn xác định một đối tượng db = SQLAlchemy(app) - đó là Database1. Bạn tham khảo nó ở khắp mọi nơi, nhưng không có tham chiếu đến Database2. Cũng lưu ý đang đề cập đến cột cho tham gia sử dụng 2 định danh phần:

Account . AccountId and Accounts . id 

trong khi bạn muốn có định danh 3 phần:

Billing . Account . AccountId and [Accounts] . Accounts . id 

Bạn đang thiếu tài sản này cho biết tên db từ định nghĩa của mỗi lớp :

__table_args__ = {'schema': 'Accounts'} 
__table_args__ = {'schema': 'Billing'}