小编Mea*_*bot的帖子

sqlalchemy postgresql枚举不会在db migrate上创建类型

我在Python3下使用Flask开发了一个web应用程序.我在db migrate/upgrade上遇到postgresql枚举类型的问题.

我在模型中添加了一个"状态"列:

class Banner(db.Model):
    ...
    status = db.Column(db.Enum('active', 'inactive', 'archive', name='banner_status'))
    ...
Run Code Online (Sandbox Code Playgroud)

生成的迁移python manage.py db migrate是:

from alembic import op
import sqlalchemy as sa

def upgrade():
    op.add_column('banner', sa.Column('status', sa.Enum('active', 'inactive', 'archive', name='banner_status'), nullable=True))

def downgrade():
    op.drop_column('banner', 'status')
Run Code Online (Sandbox Code Playgroud)

当我这样做时,python manage.py db upgrade我得到一个错误:

...
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) type "banner_status" does not exist
LINE 1: ALTER TABLE banner ADD COLUMN status banner_status

 [SQL: 'ALTER TABLE banner ADD COLUMN status banner_status']
Run Code Online (Sandbox Code Playgroud)

为什么迁移不会创建类型"banner_status"?

我究竟做错了什么?

$ pip freeze
alembic==0.8.6
Flask==0.10.1
Flask-Fixtures==0.3.3
Flask-Login==0.3.2 …
Run Code Online (Sandbox Code Playgroud)

sqlalchemy sqlalchemy-migrate flask flask-sqlalchemy flask-migrate

25
推荐指数
1
解决办法
7065
查看次数

如何为 Alembic 迁移中的每一行设置唯一值

uidMyModel模型添加了一个独特的属性:

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 sqlalchemy-migrate flask alembic flask-migrate

5
推荐指数
1
解决办法
2816
查看次数

Phoenix mix 任务上的 HTTPoison ArgumentError

mix fetch.btc在 phoenix 应用程序上有混合任务(lib/mix/tasks/fetch.btc.ex):

defmodule Mix.Tasks.Fetch.Btc do
  use Mix.Task

  def run(_args) do
    res = HTTPoison.get!("https://blockchain.info/ticker")
    IO.inspect(res)
  end
end
Run Code Online (Sandbox Code Playgroud)

当我运行时mix fetch.btc出现错误:

** (ArgumentError) argument error
    (stdlib) :ets.lookup_element(:hackney_config, :mod_metrics, 2)
    PROJ_DIR/deps/hackney/src/hackney_metrics.erl:27: :hackney_metrics.get_engine/0
    PROJ_DIR/deps/hackney/src/hackney_connect.erl:78: :hackney_connect.create_connection/5
    PROJ_DIR/deps/hackney/src/hackney_connect.erl:47: :hackney_connect.connect/5
    PROJ_DIR/deps/hackney/src/hackney.erl:330: :hackney.request/5
    lib/httpoison/base.ex:787: HTTPoison.Base.request/6
    lib/httpoison.ex:128: HTTPoison.request!/5
    lib/mix/tasks/fetch.btc.ex:14: Mix.Tasks.Fetch.Btc.run/1
    (mix) lib/mix/task.ex:331: Mix.Task.run_task/3
    (mix) lib/mix/cli.ex:79: Mix.CLI.run_task/2
    (elixir) lib/code.ex:767: Code.require_file/2
Run Code Online (Sandbox Code Playgroud)

但在我的控制器中,这段代码res = HTTPoison.get!("https://blockchain.info/ticker")工作成功!

信息:

hackney: 1.15.1
httpoison: 1.5.0
phoenix: 1.4.3
Run Code Online (Sandbox Code Playgroud)
  1. 我究竟做错了什么?
  2. 在 mix 任务中发出 http 请求的正确方法是什么?

elixir-mix elixir httprequest phoenix-framework httpoison

2
推荐指数
1
解决办法
619
查看次数