Создание пользовательских функций в 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