我正在尝试为我的Pyramid项目配置SQLAlchemy Alembic,我想使用我的developement.ini(或production.ini)进行Alembic的配置设置.是否可以在Alembic中的任何地方指定我想使用的.ini文件?
我有几个我想在create table之后运行的自定义DDL语句:
update_function = DDL("""
CREATE OR REPLACE FUNCTION update_timestamp()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = now();
RETURN NEW;
END;
$$ language 'pgplsql';
""")
update_trigger = DDL("""
CREATE TRIGGER update %(table)s_timestamp BEFORE UPDATE
ON %(table)s FOR EACH ROW EXECUTE PROCEDURE update_timestamp();
""")
Run Code Online (Sandbox Code Playgroud)
而且我像这样附上他们:
event.listen(Session.__table__, 'after_create', update_function)
event.listen(Session.__table__, 'after_create', update_trigger)
Run Code Online (Sandbox Code Playgroud)
当我这样做时create_all,我得到了我期望的SQL:
CREATE OR REPLACE FUNCTION update_timestamp()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = now();
RETURN NEW;
END;
$$ language 'pgplsql';
CREATE TRIGGER update session_timestamp BEFORE UPDATE
ON session …Run Code Online (Sandbox Code Playgroud) 我正在使用sqlalchemy,我正在尝试将alembic集成到数据库迁移中.
我的数据库目前存在,并且定义了许多没有名称的ForeignKeys.我想添加一个命名约定,以允许影响ForeignKey列的迁移.
我已将此处给出的命名约定添加到models.py文件的顶部: SQLAlchemy Naming Constraints
convention = {
"ix": 'ix_%(column_0_label)s',
"uq": "uq_%(table_name)s_%(column_0_name)s",
"ck": "ck_%(table_name)s_%(constraint_name)s",
"fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
"pk": "pk_%(table_name)s"
}
DeclarativeBase = declarative_base()
DeclarativeBase.metadata = MetaData(naming_convention=convention)
def db_connect():
return create_engine(URL(**settings.DATABASE))
def create_reviews_table(engine):
DeclarativeBase.metadata.create_all(engine)
class Review(DeclarativeBase):
__tablename__ = 'reviews'
id = Column(Integer, primary_key=True)
review_id = Column('review_id', String, primary_key=True)
resto_id = Column('resto_id', Integer, ForeignKey('restaurants.id'),
nullable=True)
url = Column('url', String),
resto_name = Column('resto_name', String)
Run Code Online (Sandbox Code Playgroud)
我根据教程说明设置了alembic/env.py,将模型的元数据提供给target_metadata.
我跑的时候
$: alembic current
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:sqlalchemy.exc.InvalidRequestError:包含%(constraint_name)标记的命名约定要求明确命名约束.
在文档中,他们说"即使我们只使用Column.unique标志,这个相同的功能[使用命名约定生成列的名称]也会生效:" 1,所以我认为应该没有问题(他们继续使用一个未命名的ForeignKey给出一个例子.
我是否需要返回并为所有约束提供明确的名称,或者是否有办法自动执行此操作?
我试图将Alembic迁移作为python包分发的一部分.由于将安装此发行版,因此Alembic脚本编目目录(包含迁移)将最终复制到python包文件夹.在这种情况下,我如何告诉Alembic在哪里找到这个目录?
在Alembic文档中,它说该migration目录可以在config.ini文件中指定为包引用:
- script_location - 这是Alembic环境的位置.它通常被指定为文件系统位置,相对或绝对.如果位置是相对路径,则将其解释为相对于当前目录.
(剪断)
为了支持将自身打包为.egg文件的应用程序,也可以将该值指定为包资源,在这种情况下,resource_filename()用于查找文件(0.2.2中的新增内容).任何包含冒号的非绝对URI在此都被解释为资源名称,而不是直接文件名.
文档没有提供进一步的信息或示例.
有没有人成功实现过这个?您如何将migrationscripting_folder变成"包资源"?那么你怎么告诉alembic在哪里找到它?
我一直在使用Flask-Migrate(Alembic)来更新我的数据库.我更新了我的models.py文件,但是我犯了一个错误.我运行了迁移并去升级数据库,但是我收到了这个错误:
sqlalchemy.exc.IntegrityError: (_mysql_exceptions.IntegrityError) (1215, 'Cannot add foreign key constraint') [SQL: u'\nCREATE TABLE topics (\n\tid INTEGER NOT NULL AUTO_INCREMENT, \n\t`subjectID` INTEGER, \n\ttopic VARCHAR(150) NOT NULL, \n\tPRIMARY KEY (id), \n\tFOREIGN KEY(`subjectID`) REFERENCES subjects (id)\n)\n\n']
Run Code Online (Sandbox Code Playgroud)
我所做的是db.Text取而代之的db.Integer是外键.
当我尝试运行新的迁移时,我得到了这个:
alembic.util.CommandError: Target database is not up to date.
Run Code Online (Sandbox Code Playgroud)
所以现在我被卡住了.我无法升级数据库,也无法运行迁移.我尝试使用以下内容降级到较旧的数据库版本:
python manage.py db downgrade --sql b877018671c:36949b1cca31
Run Code Online (Sandbox Code Playgroud)
但是当我运行时,python manage.py db current我得到了最新的数据库版本,我被困在其中.
有没有解决这个问题?谢谢.
在Setuptools setup.py文件中打包Alembic迁移文件的正确方法是什么?一切都在我的回购根源中alembic/.
这是一个Python应用程序,而不是库.
我想要的安装流程是有人可以pip install将轮子作为我的应用程序.然后,他们可以通过运行类似的方式来初始化应用程序数据库<app> alembic upgrade --sqlalchemy.url=<db_url>.然后升级将需要a pip install -U,之后他们可以再次运行Alembic命令.
这是非正统的吗?
如果没有,我将如何做到这一点?当然是console_scripts entry_points.但除此之外?
是否可以通过alembic脚本为DB表创建并发索引?
我正在使用postgres DB,并且能够在postgres提示符下通过sql命令创建并发表索引.(并行创建索引on();)
但是找不到通过Db migration(alembic)脚本创建相同的方法.如果我们创建普通索引(不是并发),它将锁定DB表,因此不能并行执行任何查询.所以只想知道如何通过alembic(数据库迁移)脚本创建并发索引
这是我的Budget架构
class Budget(db.Model):
__tablename__ = 'budgets'
# noinspection PyRedeclaration
uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True,
unique=True)
user_id = Column(GUID(), ForeignKey('users.uuid'), nullable=False)
user = relationship('User', backref='budgets')
created_on = Column('created_on', sa.types.DateTime(timezone=True),
nullable=False)
Run Code Online (Sandbox Code Playgroud)
和 BudgetCategories
class BudgetCategory(db.Model):
__tablename__ = 'budget_categories'
# noinspection PyRedeclaration
uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True,
unique=True)
budget_id = Column(GUID(), ForeignKey('budgets.uuid'), nullable=False)
budget = relationship('Budget', backref='budgetCategories',
cascade="all, delete-orphan", single_parent=True)
category = Column('category', sa.types.String, nullable=True)
parent_category = Column('parent_category', sa.types.String, nullable=True)
amount = Column('amount', Numeric(10, 2), nullable=False)
recurring = Column('recurring', …Run Code Online (Sandbox Code Playgroud) 是否alembic upgrade head在事务内运行以便所有数据库更改成功或失败?如果没有,为什么这样设计?
我在这里阅读(和观看)Flask-Migrate:https: //realpython.com/blog/python/flask-by-example-part-2-postgres-sqlalchemy-and-alembic/ 和https:// www .youtube.com /手表?ν= YJibNSI-IAE#T = 21
从本教程开始做所有事情:
安装Flask-Migrate并运行后
python manage.py db init
python manage.py db migrate
Run Code Online (Sandbox Code Playgroud)
它应该检测models.py中声明的所有表.
就我而言,它什么都没检测到.而且,根据对教程的评论,这不仅仅是我的情况.那么,我该如何做到这一点呢?
alembic ×10
python ×8
sqlalchemy ×6
flask ×2
postgresql ×2
database ×1
ddl ×1
orm ×1
pyramid ×1
setuptools ×1
transactions ×1