Создание пользовательских функций в SQLAlchemy

SQLAlchemy обеспечивает очень чистый интерфейс для определения таблиц базы данных:

engine = create_engine('sqlite:///:memory:')

metadata = MetaData()

user = Table('user', metadata,
    Column('user_id', Integer, primary_key = True),
    Column('user_name', String(16), nullable = False),
    Column('email_address', String(60), key='email'),
    Column('password', String(20), nullable = False)
)

user_prefs = Table('user_prefs', metadata,
    Column('pref_id', Integer, primary_key=True),
    Column('user_id', Integer, ForeignKey("user.user_id"), nullable=False),
    Column('pref_name', String(40), nullable=False),
    Column('pref_value', String(100))
)

и как только эти таблицы были определены, очень легко создать эти таблицы с

1 ответов


сегодня я работал над чем-то подобным. До сих пор лучший способ, который я нашел, это использовать sqlalchemy before_create прослушиватели событий. Для общих функций можно привязать события к метаданным, а для табличных функций-к таблицам. Например:

import sqlalchemy
from sqlalchemy.schema import DDL

sqlalchemy.event.listen(
    metadata,
    'before_create',
    DDL('CREATE OR REPLACE FUNCTION myfunc() ...')
)

вы можете просто заменить метаданные таблицей, если хотите создать функцию до создания таблицы.

этот DDL, кажется, работает каждый раз, когда вы называете metadata.create_all так это важно использовать CREATE OR REPLACE. Если вы хотите немного больше контроля над тем, когда создаются функции, вы можете лучше изучить миграции с помощью аламбик или аналогичные.

некоторые виды использования DDL описаны в документах sqlalchemy здесь:http://docs.sqlalchemy.org/en/latest/core/ddl.html#custom-ddl