是否可以通过alembic脚本为DB表创建并发索引?
我正在使用postgres DB,并且能够在postgres提示符下通过sql命令创建并发表索引.(并行创建索引on();)
但是找不到通过Db migration(alembic)脚本创建相同的方法.如果我们创建普通索引(不是并发),它将锁定DB表,因此不能并行执行任何查询.所以只想知道如何通过alembic(数据库迁移)脚本创建并发索引
我在这里阅读(和观看)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中声明的所有表.
就我而言,它什么都没检测到.而且,根据对教程的评论,这不仅仅是我的情况.那么,我该如何做到这一点呢?
我正在尝试在Heroku上运行一个相当简单的Flask + SQLAlchemy站点,但我不确定如何运行迁移来设置我的数据库.当我运行时heroku run alembic upgrade head,我收到以下错误:
Running `alembic upgrade head` attached to terminal... up, run.1
Traceback (most recent call last):
File "/app/.heroku/venv/bin/alembic", line 12, in <module>
load_entry_point('alembic==0.4.0', 'console_scripts', 'alembic')()
File "/app/.heroku/venv/lib/python2.7/site-packages/alembic/config.py", line 255, in main
CommandLine(prog=prog).main(argv=argv)
File "/app/.heroku/venv/lib/python2.7/site-packages/alembic/config.py", line 250, in main
self.run_cmd(cfg, options)
File "/app/.heroku/venv/lib/python2.7/site-packages/alembic/config.py", line 241, in run_cmd
**dict((k, getattr(options, k)) for k in kwarg)
File "/app/.heroku/venv/lib/python2.7/site-packages/alembic/command.py", line 124, in upgrade
script.run_env()
File "/app/.heroku/venv/lib/python2.7/site-packages/alembic/script.py", line 191, in run_env
util.load_python_file(self.dir, 'env.py')
File "/app/.heroku/venv/lib/python2.7/site-packages/alembic/util.py", line 185, in …Run Code Online (Sandbox Code Playgroud) 我的User模特是
class User(UserMixin, db.Model):
__tablename__ = 'users'
# noinspection PyShadowingBuiltins
uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True,
unique=True)
email = Column('email', String, nullable=False, unique=True)
_password = Column('password', String, nullable=False)
created_on = Column('created_on', sa.types.DateTime(timezone=True),
default=datetime.utcnow())
last_login = Column('last_login', sa.types.DateTime(timezone=True),
onupdate=datetime.utcnow())
Run Code Online (Sandbox Code Playgroud)
其中GUID是sqlalchemy docs中描述的自定义类型(完全相同)
现在我跑的时候
alembic revision --autogenerate -m "Added initial table"
Run Code Online (Sandbox Code Playgroud)
我得到了我upgrade()的
def upgrade():
### commands auto generated by Alembic - please adjust! ###
op.create_table('users',
sa.Column('uuid', sa.GUID(), nullable=False),
sa.Column('email', sa.String(), nullable=False),
sa.Column('password', sa.String(), nullable=False),
sa.Column('created_on', …Run Code Online (Sandbox Code Playgroud) 我的模型看起来像
class Category(UserMixin, db.Model):
__tablename__ = 'categories'
uuid = Column('uuid', GUID(), default=uuid.uuid4, primary_key=True,
unique=True)
name = Column('name', String, nullable=False)
parent = Column('parent', String, nullable=False)
created_on = Column('created_on', sa.types.DateTime(timezone=True),
default=datetime.utcnow())
__table_args__ = (UniqueConstraint('name', 'parent'),)
def __init__(self, name, parent):
self.name = name
self.parent = parent
def __repr__(self):
return '<Category:%s:%s:%s>' % (
self.uuid, self.name, self.category_type)
Run Code Online (Sandbox Code Playgroud)
其中GUID是自定义sqlalchemy类型我使用alembic --autogenerate选项创建表
op.create_table('categories',
sa.Column('uuid', UUID(), nullable=False),
sa.Column('name', sa.String(), nullable=False),
sa.Column('parent', sa.String(), nullable=False),
sa.Column('created_on', sa.DateTime(timezone=True),
nullable=True),
sa.PrimaryKeyConstraint('uuid'),
sa.UniqueConstraint('name', 'parent'),
sa.UniqueConstraint('uuid')
)
Run Code Online (Sandbox Code Playgroud)
和PostgreSQL表一样
Table "public.categories"
Column …Run Code Online (Sandbox Code Playgroud) 我开始将Alembic合并到我已经使用SQLAlchemy表定义的项目中.目前我的数据库架构是在我的应用程序外部管理的,我想将整个架构带入我的表定义文件中.
在PostgreSQL中,我使用自定义域来存储电子邮件地址.PostgreSQL DDL是:
CREATE DOMAIN email_address TEXT CHECK (value ~ '.+@.+')
Run Code Online (Sandbox Code Playgroud)
如何在SQLAlchemy中表示此域的创建及其作为列数据类型的用法?
我有 Alembic 迁移,它声明了这样的外键约束:
op.create_table(
'that',
...
Column('this_id', String),
ForeignKeyConstraint(['this_id'], ['this.id'])
...
)
Run Code Online (Sandbox Code Playgroud)
我的项目需要支持两个数据库——PostgreSQL 和 MySQL。由于约束的名称没有定义,每个数据库都会自动生成它。在 MySQL 中它看起来像this_ibfk_1,在 Postgres 中看起来像that_this_id_key.
现在我需要编写一个迁移来删除约束。但考虑到我不知道它的名字,我该如何引用它呢?
我正在努力找到一种干净的方式(没有原始SQL)来设置alembic中的列顺序.例如,我想在'id'列之后添加一个名为'name'的新列,如下所示:
from alembic import op
import sqlalchemy as sa
...
op.add_column(
'people',
sa.Column(
'name',
sa.String(),
nullable=False
),
after='id'
)
Run Code Online (Sandbox Code Playgroud)
但是当然,alembic没有'after'参数,因此这段代码失败了,而且我没有在docs中找到与'after'参数相当的东西.我只能将列附加到表的末尾.
任何人都可以建议如何在alembic/sqlalchemy中实现我想要的东西?没有原始SQL可能吗?
在维护 SQLAlchemy 数据模型并利用 alembic 进行版本控制时,我所做的以下代码更改导致了空修订:
some_column = Column(Boolean, nullable=False, default=False)
Run Code Online (Sandbox Code Playgroud)
以前是:
some_column = Column(Boolean, nullable=False)
Run Code Online (Sandbox Code Playgroud)
因此添加默认值不会对 alembic 产生任何变化,即生成一个空修订版。我尝试了 SQLAlchemy 提供的其他值,例如false()和,expression.false()而不是False,但结果是相同的(空的 alembic 修订版)。也尝试server_default过代替default. 有问题的数据库是 PostgreSQL。
当然,通过空修订,我的意思是 alembic 无法识别 SQLAlchemy 中所做的任何更改:
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
pass
# ### end Alembic commands ###
Run Code Online (Sandbox Code Playgroud)
感谢这方面的任何帮助。
假设数据库中有一些带有函数的触发器,如下所示:
-- Insert a new entry into another table
-- every time a NEW row is inserted
CREATE FUNCTION trgfunc_write_log() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO some_other_table (
-- some columns
meter_id,
date_taken,
temperature,
) values (
NEW.meter_id,
NEW.time_taken,
NEW.temperature
);
return NEW;
END;
$$ language 'plpgsql';
-- The trigger itself: AFTER INSERT
CREATE TRIGGER trg_temperature_readings
AFTER INSERT ON temperature_readings
FOR EACH ROW
EXECUTE FUNCTION trgfunc_write_log();
Run Code Online (Sandbox Code Playgroud)
通常,此触发器将位于我的 SqlAlchemy 模型旁边,并使用如下内容自动创建:
from sqlalchemy import DDL, event
from sqlalchemy.ext.declarative import declarative_base
Base …Run Code Online (Sandbox Code Playgroud) alembic ×10
python ×8
sqlalchemy ×8
postgresql ×5
database ×2
flask ×2
heroku ×1
mysql ×1
orm ×1
sql ×1
sql-domain ×1
triggers ×1