我正在开发一个使用 sqlalchemy、postgres 和 alembic 的应用程序。
\n项目结构如下:
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 alembic.ini\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 migrations\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 env.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 script.py.mako\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 versions\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 models\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 base.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 datamodel1.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 datamodel2.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 requirements.txt\n\n3 directories, 10 files\nRun Code Online (Sandbox Code Playgroud)\n其中:
\n的内容models/base.py是:
from sqlalchemy.ext.declarative.api import declarative_base, DeclarativeMeta\n\nBase: DeclarativeMeta = declarative_base()\nRun Code Online (Sandbox Code Playgroud)\n的内容models/datamodel1.py是:
from models.base import Base\nfrom sqlalchemy.sql.schema import Column\nfrom sqlalchemy.sql.sqltypes import String, Date, Float\n\n\nclass Model1(Base):\n __tablename__ = 'model1_table'\n\n model1_id = Column(String, primary_key=True)\n col1 = Column(String)\n col2 = Column(String)\nRun Code Online (Sandbox Code Playgroud)\n的内容models/datamodel2.py …
我尝试简单地删除unique=True约束并运行
flask db migrate
flask db upgrade
Run Code Online (Sandbox Code Playgroud)
在命令行中,但是当我运行我的烧瓶应用程序时,我仍然收到错误(sqlite3.IntegrityError) UNIQUE constraint failed。
有没有一种简单的方法可以使用 Flask-migrate 来做到这一点,或者我应该切换到 alembic (我知道 Flask-migrate 只是围绕着它)?我不想删除整个表。谢谢你的帮助!
我转而使用 TortoiseORM 中的 SQLAlchemy,并认为我应该研究 Alembic 来处理其迁移。编辑env.py和alembic.ini文件后,我仍然无法让 alembic 生成任何迁移。
该错误sqlalchemy.exc.MissingGreenlet: greenlet_spawn has not been called; can't call await_only() here. Was IO attempted in an unexpected place? (Background on this error at: https://sqlalche.me/e/14/xd2s) sys:1: RuntimeWarning: coroutine 'connect' was never awaited是不言自明的,但我不知道到底要更改什么。
我正在遵循FastAPI-Users文档中的指示,但完全迷失了。
我尝试过的:
run_migrations_offline()和run_migrations_online()作为asyncasyncio.run()to 这样我就可以运行它们模型.py
import os
from typing import AsyncGenerator
from fastapi import Depends
from fastapi_users.db import SQLAlchemyBaseUserTableUUID, SQLAlchemyUserDatabase
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from …Run Code Online (Sandbox Code Playgroud) 每当我运行任何alembic命令时都会发生这种情况。我正在使用 sqlalchemy 版本 2.0.3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/ado/anaconda3/lib/python3.8/site-packages/alembic/__init__.py", line 8, in <module>
from . import op # noqa
File "/home/ado/anaconda3/lib/python3.8/site-packages/alembic/op.py", line 1, in <module>
from .operations.base import Operations
File "/home/ado/anaconda3/lib/python3.8/site-packages/alembic/operations/__init__.py", line 1, in <module>
from .base import Operations, BatchOperations
File "/home/ado/anaconda3/lib/python3.8/site-packages/alembic/operations/base.py", line 3, in <module>
from .. import util
File "/home/ado/anaconda3/lib/python3.8/site-packages/alembic/util/__init__.py", line 9, in <module>
from .sqla_compat import ( # noqa
File "/home/ado/anaconda3/lib/python3.8/site-packages/alembic/util/sqla_compat.py", line 8, in <module>
from sqlalchemy.sql.expression …Run Code Online (Sandbox Code Playgroud) 在合适的sqlite版本中,我们可以通过'PRAGMA foreign_keys = ON'强制执行外键约束.但是,每次进行连接时,用户都无法登录数据库.所以我想知道如何让它在sqlalchemy/alembic的迁移脚本中运行?非常感谢!
在将此标记为重复之前:
我确实看了这个问题/答案,我确实做了它的建议,但当我添加这个代码时:
permslookup = sa.Table('permslookup',
sa.Column('perms_lookup_id', primary_key=True),
sa.Column('name', sa.Unicode(40), index=True),
sa.Column('description', sa.Text),
sa.Column('value', sa.Numeric(10, 2)),
sa.Column('ttype', sa.PickleType(), index=True),
sa.Column('permission', sa.Unicode(40), index=True),
sa.Column('options', sa.PickleType())
)
Run Code Online (Sandbox Code Playgroud)
然后运行alembic upgrade head,我收到以下错误:
AttributeError: Neither 'Column' object nor 'Comparator' object has an attribute 'schema'
Run Code Online (Sandbox Code Playgroud)
当我检查完整的堆栈跟踪时,我注意到这导致了错误:
sa.Column('options', sa.PickleType())
Run Code Online (Sandbox Code Playgroud)
这是上面代码的最后一行......我该如何解决这个问题?我不知道如何解决它...任何形式的帮助将不胜感激.
这是我要插入的数据:
op.bulk_insert('permslookup',
[
{
'id': 1,
'name': 'accounts',
'description': """ Have permission to do all transactions """,
'value': 1,
'ttype': ['cash', 'loan', 'mgmt', 'deposit', 'adjustments'],
'permission': 'accounts',
'options': None
},
{
'id': 2,
'name': …Run Code Online (Sandbox Code Playgroud) 使用此设置:
-Development environment
-Flask
-SQLAlchemy
-Postgres
-Possibility Alembic
Run Code Online (Sandbox Code Playgroud)
如果我有一个数据库,其中一些表填充了随机数据.据我所知,Flask-Migrate将使用Alembic,不会保留数据,只保持模型和数据库同步.
但是使用Alembic或者只是删除>创建所有表之间有什么区别?
就像是:
db.create_all()
Run Code Online (Sandbox Code Playgroud)
第二个问题:
当模型中的某些变化时,数据会发生什么变化?数据会丢失吗?或者Alembic可以保留以前填充的数据?
好吧,我的想法是用一些数据填充数据库,然后避免模型更改时丢失任何数据.Alembic是解决方案吗?
或者我需要从.sql文件导入数据,例如,当我更改模型和数据库时?
我需要通过向现有表添加一个表和一列来更新我的数据库.新列和表应具有一对多关系.
这是alembic修订文件:
def upgrade():
op.create_table('categories',
sa.Column('category_id', sa.Integer, primary_key=True),
sa.Column('category_name', sa.String(30)),
sa.Relationship('post', backref='cat', lazy='dynamic') )
op.add_column('post', sa.Column('category', sa.Integer, sa.ForeignKey('categories.category_id')) )
Run Code Online (Sandbox Code Playgroud)
问题出在这一行:
sa.Relationship('post', backref='cat', lazy='dynamic') )
Run Code Online (Sandbox Code Playgroud)
在这里定义关系的正确代码是什么?谢谢
如何使用Alembic清除历史记录?我在中找不到此选项alembic history。我想从第一次迁移开始,而不是从最后一次应用开始。
因此在Flask中,我models.py包含了所有我的模型定义。我想将其分离到一个models目录下的多个模型文件中。
我通过添加一些模型文件(例如models/user_model.py)models/booking_model.py等进行了尝试,但alembic似乎无法检测到这些文件中的模型。
在带有Flask的标准alembic.ini中,我具有:
# A generic, single database configuration.
[alembic]
# template used to generate migration files
# file_template = %%(rev)s_%%(slug)s
# set to 'true' to run the environment during
# the 'revision' command, regardless of autogenerate
# revision_environment = false
# Logging configuration
[loggers]
keys = root,sqlalchemy,alembic
[handlers]
keys = console
[formatters]
keys = generic
[logger_root]
level = WARN
handlers = console
qualname =
[logger_sqlalchemy]
level = WARN
handlers =
qualname …Run Code Online (Sandbox Code Playgroud)alembic ×10
python ×7
sqlalchemy ×6
flask ×3
postgresql ×2
sqlite ×2
fastapi ×1
migration ×1
mysql ×1
python-3.x ×1