Baňka zdědil tříd tabulek ve více identických databázích pomocí __bind_key__

hlasů
1

Snažím se vybudovat ovládacím panelu administrátora, která sdružuje čtyři různé e-commerce weby. Na všechny stránky mají stejné databázové struktury (všechny MySQL).

To, co se děje špatně?

Mám 404 nenacházejí na libovolném pořadí ID a místo jsem vložil. Bez ohledu na to, jak jsem to míchat nemohu dostat v žádném záznamu přijít. Vždy 404 a já nemám ponětí, proč. Tak jsem tady.

Kód

Snažil jsem se to udělat tím, že vytvoří základní model třídy každém stole. Pak se vytváří zděděných třídách těchto základních tříd s odlišným vazby klíče v závislosti na DB je určen pro. To je shrnut pohled na kódu - pokud byste potřebovat víc, než to, dejte mi vědět:

basemodels.py

MyOrderClass(db.Model):
    __tablename__ = 'messytablename'
    id = db.Column('order_id', db.Integer, primary_key=True)
    order_total = db.Column(db.Float)
    order_status = db.Column(db.String(1))

site2models.py

class Site2Order(MyOrderClass):
    __bind_key__ = 'site2'

__init__.py

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:pass@localhost/site'
app.config['SQLALCHEMY_BINDS'] = {
    'site1':'mysql://user:pass@localhost/site1',
    'site2':'mysql://user:pass@localhost/site2',
    'site3':'mysql://user:pass@localhost/site3',
    'site4':'mysql://user:pass@localhost/site4'
}

views.py

@app.route('/order/<site>/<orderid>')
def show_order(site, orderid):
    if site == 'site1':
        orderObject = Site1Order
    if site == 'site2':
        orderObject = Site2Order
    if site == 'site3':
        orderObject = Site3Order
    if site == 'site4':
        orderObject = Site4Order

    order = orderObject.query.get(orderid)
    return render_template('order.html', order=order)

Původní stránky jsou postaveny v PHP a mají méně než upravených konstrukcí a jmenovat konvence.

Děkuji vám za Váš čas.

Položena 29/07/2011 v 12:35
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
3

Problém v současné době s SQLALCHEMY_BINDS je, že se používá pouze pro operace, jako je create_all () nebo drop_all () - je třeba změnit relaci závazný pro které:

db.session.bind = db.get_engine(app, 'site2')

Tam je práce probíhají změny, které ale není to v kufru ještě.

Váš kód by mohl být takto:

db.session.bind = db.get_engine(app, orderObject.__bind_key__)
order = orderObject.query.get(orderid)

Ale nezapomeňte, že to změní globální relace a nenahrazuje ho obnovit, kterou musíte udělat, aby sami, nebo napsat contextmanager, takže můžete použít withpříkaz na to.

Pokud jsou vaše modely jsou identické přes všechny databáze by to mohlo být také způsob, jak mít pouze jednu třídu pro všechny databáze, ponechte bind_key a dotaz je speciální objekt bind relace.

Edit : s Flask-SQLAlchemy 0.15 Release jednoduchý MyModel.query.filter (...) je možné různými databázemi, pokud jste definovali __bind_key__ správně.

Odpovězeno 01/08/2011 v 10:07
zdroj uživatelem

hlasů
0

db.Model.metadata.tables [ 'model name']. info [ 'bind_key'] = 'Vaše bind_name'

Našel jsem způsob, jak dělat věci jednoduše

Odpovězeno 18/09/2018 v 07:32
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more