/ / मैं उन्नयन के अंदर सत्र वस्तुओं के माध्यम से डेटा को बदलने की इच्छा होने पर एक एलेम्बिक प्रवास का परीक्षण कैसे करूं? - पायथन, स्क्वैल्सीम, एलेम्बिक

जब मैं अपग्रेड के अंदर सत्र ऑब्जेक्ट के माध्यम से डेटा को बदलना चाहता हूं, तो मैं एक एलेम्बिक माइग्रेशन का परीक्षण कैसे कर सकता हूं? - पायथन, स्क्वैल्सीम, एलेम्बिक

मैं एक डेटाबेस करने के लिए alembic प्राप्त करने की कोशिश कर रहा हूंमेरे लिए प्रवास। मैंने अपने मॉडल में बदलाव किए हैं जो दो नए कॉलम जोड़ते हैं, जिसमें डेटा होगा जिसकी गणना तालिका में वर्तमान पंक्तियों के आधार पर की जाती है। मैं वास्तव में क्या करना चाहता हूं, यह पता लगाना है कि वास्तव में यह करने से पहले माइग्रेशन क्या परीक्षण करना है। मेरी समझ है-sql तर्क मुझे ऐसा करने की अनुमति देगा।

जब मैं निम्नलिखित कमांड लाइन का उपयोग करके वास्तव में ऐसा करने से पहले माइग्रेशन का परीक्षण करने के लिए --sql के साथ अपग्रेड करने की कोशिश करता हूं:

alembic -c dev_alembic.ini upgrade --sql 3e0

मुझे alembic से एक त्रुटि प्राप्त हो रही है:

BEGIN TRANSACTION;

CREATE TABLE alembic_version (
version_num VARCHAR(32) NOT NULL
);

GO

-- Running upgrade  -> 3e076afb70e1

ALTER TABLE sipendpoint ADD extension VARCHAR(50) NULL;

GO

ALTER TABLE sipendpoint ADD home_site VARCHAR(5) NULL;

GO

Traceback (most recent call last):
File "/home/pgrace/venv/pyramid27/bin/alembic", line 9, in <module>
load_entry_point("alembic==0.7.6", "console_scripts", "alembic")()
File "/home/pgrace/venv/pyramid27/lib/python2.7/site-packages/alembic/config.py", line 439, in main
CommandLine(prog=prog).main(argv=argv)
File "/home/pgrace/venv/pyramid27/lib/python2.7/site-packages/alembic/config.py", line 433, in main
self.run_cmd(cfg, options)
File "/home/pgrace/venv/pyramid27/lib/python2.7/site-packages/alembic/config.py", line 416, in run_cmd
**dict((k, getattr(options, k)) for k in kwarg)
File "/home/pgrace/venv/pyramid27/lib/python2.7/site-packages/alembic/command.py", line 165, in upgrade
script.run_env()
File "/home/pgrace/venv/pyramid27/lib/python2.7/site-packages/alembic/script.py", line 390, in run_env
util.load_python_file(self.dir, "env.py")
File "/home/pgrace/venv/pyramid27/lib/python2.7/site-packages/alembic/util.py", line 243, in load_python_file
module = load_module_py(module_id, path)
File "/home/pgrace/venv/pyramid27/lib/python2.7/site-packages/alembic/compat.py", line 79, in load_module_py
mod = imp.load_source(module_id, path, fp)
File "alembic/env.py", line 65, in <module>
run_migrations_offline()
File "alembic/env.py", line 44, in run_migrations_offline
context.run_migrations()
File "<string>", line 7, in run_migrations
File "/home/pgrace/venv/pyramid27/lib/python2.7/site-packages/alembic/environment.py", line 738, in run_migrations
self.get_context().run_migrations(**kw)
File "/home/pgrace/venv/pyramid27/lib/python2.7/site-packages/alembic/migration.py", line 309, in run_migrations
step.migration_fn(**kw)
File "/home/pgrace/repo/stackcallrouterserver/alembic/versions/3e076afb70e1_add_extension_field_and_home_site_to_.py", line 48, in upgrade
for entry in DBSession.query(SIPEndpoint):
File "/home/pgrace/venv/pyramid27/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2515, in __iter__
return self._execute_and_instances(context)
File "/home/pgrace/venv/pyramid27/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2528, in _execute_and_instances
close_with_result=True)
File "/home/pgrace/venv/pyramid27/lib/python2.7/site-packages/sqlalchemy/orm/query.py", line 2519, in _connection_from_session
**kw)
File "/home/pgrace/venv/pyramid27/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 882, in connection
execution_options=execution_options)
File "/home/pgrace/venv/pyramid27/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 887, in _connection_for_bind
engine, execution_options)
File "/home/pgrace/venv/pyramid27/lib/python2.7/site-packages/sqlalchemy/orm/session.py", line 344, in _connection_for_bind
transaction = conn.begin()
AttributeError: "MockConnection" object has no attribute "begin"

यहाँ प्रश्न में माइग्रेशन फ़ाइल है:

# revision identifiers, used by Alembic.
revision = "3e076afb70e1"
down_revision = None
branch_labels = None
depends_on = None

from alembic import op
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
import re
from scrserver.models import SIPEndpoint

from sqlalchemy.orm import (
scoped_session,
sessionmaker,
)

DBSession = scoped_session(sessionmaker(bind=op.get_bind()))
Base = declarative_base()
Base.metadata.bind = op.get_bind()

def sitecheck(x):
try:
return {
"1.2.3.4": "FOO",
"5.6.7.8": "BAR",
"9.10.11.12": "BAZ"
}
except KeyError:
return None

def upgrade():
### commands auto generated by Alembic - please adjust! ###
op.add_column("sipendpoint", sa.Column("extension", sa.String(length=50), nullable=True))
op.add_column("sipendpoint", sa.Column("home_site", sa.String(length=5), nullable=True))

### end Alembic commands ###


for entry in DBSession.query(SIPEndpoint):
update=sa.update(SIPEndpoint).where(SIPEndpoint.addr==entry.addr).values(extension=entry.addr)
op.execute(update)


def downgrade():
### commands auto generated by Alembic - please adjust! ###
op.drop_column("sipendpoint", "home_site")
op.drop_column("sipendpoint", "extension")
### end Alembic commands ###

उत्तर:

जवाब के लिए 3 № 1

आप इसे नहीं चला सकते:

for entry in DBSession.query(SIPEndpoint):

insql मोड, क्योंकि यह एक सेलेक्ट स्टेटमेंट है। ऐसा कोई डेटाबेस नहीं है, जिसके साथ सेस्कल मोड में सेलेक्ट करना है।

एक स्क्रिप्ट का "ड्राई रन" करने का कोई तरीका नहीं है जो डेटाबेस के साथ बातचीत करना चाहता है, उदा। एक स्क्रिप्ट जो डेटा को पुनः प्राप्त करने पर निर्भर करती है से डेटाबेस। -sql मोड सिर्फ उन कमांड्स तक ही सीमित है, जिन्हें बिल्कुल भी बातचीत की आवश्यकता नहीं है, उदा। बनाएँ, ड्रॉप और अलर्ट बयान, और एक करने के लिए बेहद सीमित डिग्री, INSERT, UPDATE और DELETE स्टेटमेंट्स, जिन्हें बहुत विशेष तरीकों से उत्सर्जित किया जाना चाहिए, जैसे कि वे ऑपरेशन के बारे में जानकारी का अनुरोध करने का प्रयास नहीं करते हैं। INSERT के लिए, थोक सम्मिलित करें शैली की सिफारिश की जाती है क्योंकि इसे --sql मोड के साथ संगत करने के लिए डिज़ाइन किया गया है।