我已经定义了一些模型,其中包含一些用于 m2m 关系的关联表:
from itsdangerous import TimedJSONWebSignatureSerializer
from passlib.hash import bcrypt
from sqlalchemy.ext.declarative import declarative_base
import app
from app import db
Base = declarative_base()
class UserGroupRelationship(Base):
__tablename__ = 'users_groups'
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
group_id = db.Column(db.Integer, db.ForeignKey('groups.id'), primary_key=True)
class FriendRelationship(Base):
__tablename__ = u'users_friends'
id = db.Column(db.Integer, primary_key=True)
user_left = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
user_right = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
class User(db.Model):
__tablename__ = u'users'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
email = db.Column(db.String(120), unique=True)
password = …Run Code Online (Sandbox Code Playgroud) 我需要用 uuid 替换模型中的默认整数 id。问题是它正在另一个模型(外键)中使用。关于如何在不丢失数据的情况下执行此操作的任何想法?
class A(Base):
__tablename__ = 'a'
b_id = Column(
GUID(), ForeignKey('b.id'), nullable=False,
server_default=text("uuid_generate_v4()")
)
class B(Base):
__tablename__ = 'b'
id = Column(
GUID(), primary_key=True,
server_default=text("uuid_generate_v4()")
)
Run Code Online (Sandbox Code Playgroud)
不幸的是它不起作用,而且我担心我会破坏这种关系。
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) default for column "id" cannot be cast automatically to type uuid
Run Code Online (Sandbox Code Playgroud)
我尝试过的 Alembic 迁移类似于:
op.execute('ALTER TABLE a ALTER COLUMN b_id SET DATA TYPE UUID USING (uuid_generate_v4())')
Run Code Online (Sandbox Code Playgroud) 我想列出所有迁移和数据库状态(是否已应用迁移)。
我正在寻找与 Rails 相当的东西rake db:migrate:status。
示例输出rake db:migrate:status:
database: dev
Status Migration ID Migration Name
--------------------------------------------------
up 20180108162849 Add user table
up 20180110135954 Add article table
down 20180130152036 Add index to user
Run Code Online (Sandbox Code Playgroud) 有什么方法可以将当前修订号存储在数据库中吗?我的意思是,当我生成迁移和升级头时,如何在数据库中插入此修订号,并在下次进行迁移时检查表中的此修订号。
我想动态地将列添加到数据库中的表中,因为我不想在 SQLalchemy 类中设置表时指定所有列
为了解决这个问题,我使用 alembic 将列添加到表中,但我遇到了问题。
在我的 python 脚本中,我定义了一个类,如下所示。
DATABASE_URL_dev = "postgresql+psycopg2://user:password@localhost:5432/testdb"
engine = create_engine(DATABASE_URL_dev)
Base = declarative_base(engine)
class my_class1(Base):
__tablename__ = "test1"
id = Column(Integer, primary_key=True)
list = Column(String)
def loadsession():
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
return session
session = loadsession()
Run Code Online (Sandbox Code Playgroud)
现在我想向数据库中的表 test1 添加一个新列(“new_column”)。
然后,我使用 Alembic 按照https://alembic.sqlalchemy.org/en/latest/tutorial.html上的说明进行操作,并执行了以下操作:
我按照Alembic 的文档自动生成迁移。我的项目结构如下所示:
alembic/
versions/
env.py
README
script.py.mako
data/
__init__.py
db.py
models.py
alembic.ini
app.db
Run Code Online (Sandbox Code Playgroud)
env.py我完全按照文档进行了更改:
from logging.config import fileConfig
from sqlalchemy import engine_from_config
from sqlalchemy import pool
from alembic import context
from data.models import Base
# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config
# Interpret the config file for Python logging.
# This line sets up loggers basically.
fileConfig(config.config_file_name)
# add your model's …Run Code Online (Sandbox Code Playgroud) 我一直试图在过去的7个小时内为我的Flask应用程序配置Alembic迁移系统但没有成功.关于我做错了什么的任何想法?
我已经尝试了我在这里找到的所有解决方案,但它们似乎对我不起作用.
I get the following error after running the commands:
$ heroku run alembic revision -m "please work" --autogenerate
Running `alembic revision -m please work --autogenerate` attached to terminal... up, run.6050
Traceback (most recent call last):
File "/app/.heroku/python/bin/alembic", line 9, in <module>
load_entry_point('alembic==0.5.0', 'console_scripts', 'alembic')()
File "/app/.heroku/python/lib/python2.7/site-packages/pkg_resources.py", line 337, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/app/.heroku/python/lib/python2.7/site-packages/pkg_resources.py", line 2281, in load_entry_point
return ep.load()
File "/app/.heroku/python/lib/python2.7/site-packages/pkg_resources.py", line 1991, in load
entry = __import__(self.module_name, globals(),globals(), ['__name__'])
Run Code Online (Sandbox Code Playgroud)
ImportError:没有名为config的模块
另外,请注意,我正试图让它在Heroku上工作
我的env.py文件的一部分:
from alembic import …Run Code Online (Sandbox Code Playgroud) 下面的模型加上错误信息.
我试图使用Alembic创建一些数组列,但获取NameError:name'String'未定义.
任何有价值的帮助
谢谢!
from sqlalchemy import Column, String, Integer, DateTime
from serve_spec.db_global import db
import datetime
from time import time
from sqlalchemy.dialects.postgresql import JSON
from sqlalchemy.dialects.postgresql import ARRAY
class Issues(db.Base):
__tablename__ = 'issues'
id = Column(String, primary_key=True)
thread_id = Column(String, nullable=False)
created = Column(DateTime(timezone=False), nullable=False, default=datetime.datetime.utcnow)
created_timestamp = Column(Integer, nullable=False, default=time)
created_by_user_name = Column(String, nullable=False)
is_parent = Column(Integer, nullable=False)
parent_title = Column(String)
subscribed = Column(ARRAY(String))
unsubscribed = Column(ARRAY(String))
pending_notifications_web = Column(ARRAY(String))
pending_notifications_email = Column(ARRAY(String))
markdown_text = Column(String, nullable=False, ) …Run Code Online (Sandbox Code Playgroud) 我正在尝试为基于模型的表创建多个(即2列索引)。但我不想给出这个索引的具体名称。我想要这样naming_convention,并且alembic revision --autogenerate会通过命名索引来完成它的工作。到目前为止我有这样的代码:
from sqlalchemy import MetaData
from sqlalchemy.ext.declarative import as_declarative
from sqlalchemy.schema import Index
metadata = MetaData(
naming_convention={
'pk': '%(table_name)s_pk',
'ix': '%(table_name)s_%(column_0_N_name)s_ix',
},
)
@as_declarative(metadata=metadata)
class Base:
pass
class Foo(Base):
id = Column(Integer, primary_key=True)
col1 = Column('Col1', Integer)
col2 = Column('Col2', DateTime)
Index(
metadata.naming_convention['ix'] % {
'table_name': Foo.__tablename__,
'column_0_N_name': Foo.col1.expression.name + "_" + Foo.col2.expression.name
},
Foo.col1,
Foo.col2,
)
Run Code Online (Sandbox Code Playgroud)
所以我想避免代码的“创建名称”部分:
metadata.naming_convention['ix'] % {
'table_name': Foo.__tablename__,
'column_0_N_name': Foo.col1.expression.name + "_" + Foo.col2.expression.name
}
Run Code Online (Sandbox Code Playgroud)