我已经使用 sqlalchemy 和 sqlalchemy-migrate 向数据库添加了一个表,当我对命中数据库的无关代码运行单元测试时,出现以下错误:
Traceback (most recent call last):
File "/Users/lorin/nova/instance_type_metadata/.nova-venv/lib/python2.6/site-packages/nose/suite.py", line 208, in run
self.setUp()
File "/Users/lorin/nova/instance_type_metadata/.nova-venv/lib/python2.6/site-packages/nose/suite.py", line 291, in setUp
self.setupContext(ancestor)
File "/Users/lorin/nova/instance_type_metadata/.nova-venv/lib/python2.6/site-packages/nose/suite.py", line 314, in setupContext
try_run(context, names)
File "/Users/lorin/nova/instance_type_metadata/.nova-venv/lib/python2.6/site-packages/nose/util.py", line 478, in try_run
return func()
File "/Users/lorin/nova/metadata-debugging/nova/tests/__init__.py", line 62, in setup
FLAGS.vpn_start,
File "/Users/lorin/nova/metadata-debugging/nova/network/manager.py", line 577, in create_networks
network_ref = db.network_get_by_cidr(context, cidr)
File "/Users/lorin/nova/metadata-debugging/nova/db/api.py", line 628, in network_get_by_cidr
return IMPL.network_get_by_cidr(context, cidr)
File "/Users/lorin/nova/metadata-debugging/nova/db/sqlalchemy/api.py", line 99, in wrapper
return f(*args, **kwargs)
File "/Users/lorin/nova/metadata-debugging/nova/db/sqlalchemy/api.py", line 1308, in …Run Code Online (Sandbox Code Playgroud) 在这个帖子中,有人指出我使用sqlalchemy-migrate来帮助使用sqlalchemy快速变化的Web应用程序.但是,还建议使用" 自己动手"方法,包括手动为新数据库模式编写CSV列,最后导入它们.
问题是我无法找到sqlalchemy-migrate的真实示例.我发现的资源最多只需要添加一个列或一列重命名.官方文档基本上描述了API,很难看到如何有效地使用迁移.从文档中我甚至不知道迁移是否有助于更改数据库引擎,例如从sqlite到mysql,而DIY解决方案可以完成工作.
我真的希望看到代码可以对数据库模式进行一些非平凡的转换,并证明迁移确实是一个有用的工具.
我在哪里可以找到sqlalchemy-migrate的好例子/教程?
谢谢 !
我想要的是有一个类似于以下的工作流程:
这是非常简单的,即使它不支持高级功能(如多个数据库),它确实知道如何添加/删除列,这是一个常见的用例.
我migrate用来创建SQL数据库模式并用初始数据填充它.后来SQLAlchemy用于处理此DB.
我怎样才能测试我的SQLAlchemy模型是否与生成的真实数据库模式相关/正确migrate?
我想将列添加到现有表的某个位置或移动其中一列.但我在Sqlalchemy-migrate中找不到任何方法.
我想知道sqlalchemy-migrate中MySQL查询后的等效方法
ALTER TABLE tablename ADD column_name2 INT AFTER column_name1
ALTER TABLE tablename ADD column_name2 INT FIRST
ALTER TABLE tablename MODIFY COLUMN column_name2 INT AFTER column_name1;
Run Code Online (Sandbox Code Playgroud) 我有一个标准的磨机Pylons金字塔应用程序,它使用SQLAlchemy作为其数据库持久性.
我已经设置了一个SQLAlchemy-migrate repo并使其正常运行,但我真的希望能够使用paster升级和降级数据库,或者至少某种方式让用户(安装鸡蛋后)升级/降级数据库到所需的版本.
我现在已将它内置到我的应用程序中,因此在应用程序启动时它会进行版本升级,但我宁愿选择用户明确必须升级数据库的内容,以便他们确切知道发生了什么,并且知道事先做备份.
我该怎么办呢?如何添加粘贴命令?
用户设置应用程序的方式是:
paste make-config appname production.ini
paste setup-app production.ini#appname
Run Code Online (Sandbox Code Playgroud)
要进行第一次设置,要进行数据库升级或升级,我希望:
paste upgrade-app production.ini#appname
Run Code Online (Sandbox Code Playgroud)
或类似的规定.
该model.py看起来是这样的:
import datetime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, Numeric, ForeignKey, DateTime, Boolean
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, relationship
from configs import config_base as config
Base = declarative_base()
class User(Base):
__tablename__ = 'user'
id = Column(String, unique=True, primary_key=True)
name = Column(String(100), nullable=False)
team_id = Column(String, ForeignKey('team.id'))
last_modified_on = Column(DateTime, default=datetime.datetime.utcnow())
team = relationship('Team', back_populates='members')
class Team(Base):
__tablename__ = 'team'
id = Column(String, unique=True, primary_key=True)
name = Column(String, nullable=False)
bot_access_token = Column(String(100), …Run Code Online (Sandbox Code Playgroud) 我uid为MyModel模型添加了一个独特的属性:
class MyModel(db.Model):
...
uid = db.Column(db.String(50), nullable=False)
...
__table_args__ = (UniqueConstraint('uid', name='unique_uid'),)
Run Code Online (Sandbox Code Playgroud)
我有一个迁移:
def upgrade():
op.add_column('mymodel', sa.Column('uid', sa.String(length=50), nullable=True))
mymodel = table('mymodel', column('uid'))
op.execute(mymodel.update().values(uid=generate_uid()))
op.create_unique_constraint('unique_uid', 'mymodel', ['uid'])
op.alter_column(
table_name='mymodel',
column_name='uid',
nullable=False
)
Run Code Online (Sandbox Code Playgroud)
运行时db upgrade我遇到错误:
...
psycopg2.IntegrityError: could not create unique index "unique_uid"
DETAIL: Key (uid)=(c92U6txA2) is duplicated.
Run Code Online (Sandbox Code Playgroud)
如何为 op.execute(mymodel.update().values(uid=generate_uid())) 上的每一行设置唯一值?
$ pip freeze
alembic==0.8.6
Flask==0.10.1
Flask-Fixtures==0.3.3
Flask-Login==0.3.2
Flask-Migrate==1.8.0
Flask-Script==2.0.5
Flask-SQLAlchemy==2.1
itsdangerous==0.24
Jinja2==2.8
Mako==1.0.4
MarkupSafe==0.23
psycopg2==2.6.1
python-editor==1.0
requests==2.10.0
SQLAlchemy==1.0.13
Werkzeug==0.11.9
Run Code Online (Sandbox Code Playgroud) 我正在尝试在新系统上设置新的数据库,但出现此错误:
sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedObject) collation "NOCASE" for encoding "UTF8" does not exist
LINE 4: email VARCHAR(120) COLLATE "NOCASE" NOT NULL,
^
[SQL:
CREATE TABLE users (
id SERIAL NOT NULL,
email VARCHAR(120) COLLATE "NOCASE" NOT NULL,
password VARCHAR(128) NOT NULL
)
]
Run Code Online (Sandbox Code Playgroud)
我没有更改任何内容,但这适用于两台不同的计算机,其中一台运行 Postgresql 10。我使用 SqlAlchemy 升级运行此查询只是为了获取信息。
我用这个创建了数据库:
CREATE DATABASE db
WITH
OWNER = postgres
ENCODING = 'UTF8'
LC_COLLATE = 'tr_TR.utf8'
LC_CTYPE = 'tr_TR.utf8'
TABLESPACE = pg_default
CONNECTION LIMIT = -1;
Run Code Online (Sandbox Code Playgroud) 我使用sqlalchemy创建表,其中一些表具有多个外键关系,下面是代码。我收到错误消息:
sqlalchemy.exc.NoForeignKeysError:找不到“项目”和“类型”之间的任何外键关系
尝试运行脚本时。
谁能解释我如何在sqlalchemy中创建表,如果存在具有多个关系的表,则创建的顺序。
import sqlalchemy
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base
import datetime
from sqlalchemy import *
engine = sqlalchemy.create_engine('postgresql+psycopg2://postgres:newpassword@localhost:5432/test');
Session = sessionmaker(bind=engine)
session = Session()
metadata = MetaData(engine)
metadata.drop_all(engine)
Base = declarative_base(metadata=metadata)
class User(Base):
__tablename__ = 'users'
id = Column(Integer,primary_key = True)
email = Column(String(30),nullable = False)
password = Column(String(30),nullable = False)
class Genre(Base):
__tablename__ = 'genre'
id = Column(Integer,primary_key = True)
title = Column(String(30),nullable = False)
class Status(Base):
__tablename__ = 'status'
id = Column(Integer,primary_key = …Run Code Online (Sandbox Code Playgroud) sqlalchemy ×10
python ×7
alembic ×2
sql ×2
database ×1
django ×1
flask ×1
migrate ×1
paster ×1
postgresql ×1
pylons ×1
pyramid ×1
python-3.5 ×1