psycopg2: এক প্রশ্নের সাথে একাধিক সারি multipleোকান


141

আমাকে একটি ক্যোয়ারী সহ একাধিক সারি সন্নিবেশ করা দরকার (সারিগুলির সংখ্যা স্থির নয়), সুতরাং আমাকে এই জাতীয় ক্যোয়ারী চালানো দরকার:

INSERT INTO t (a, b) VALUES (1, 2), (3, 4), (5, 6);

আমি জানি একমাত্র উপায়

args = [(1,2), (3,4), (5,6)]
args_str = ','.join(cursor.mogrify("%s", (x, )) for x in args)
cursor.execute("INSERT INTO t (a, b) VALUES "+args_str)

তবে আমি কিছু সহজ উপায় চাই।

উত্তর:


219

আমি একটি প্রোগ্রাম তৈরি করেছি যা অন্য শহরে অবস্থিত একটি সার্ভারে একাধিক লাইন সন্নিবেশ করায়।

আমি আবিষ্কার করেছি যে এই পদ্ধতিটি ব্যবহার করা তার চেয়ে প্রায় 10 গুণ বেশি দ্রুত ছিল executemany। আমার ক্ষেত্রে tupপ্রায় 2000 সারি সমেত একটি টুপল। এই পদ্ধতিটি ব্যবহার করার সময় এটি প্রায় 10 সেকেন্ড সময় নিয়েছে:

args_str = ','.join(cur.mogrify("(%s,%s,%s,%s,%s,%s,%s,%s,%s)", x) for x in tup)
cur.execute("INSERT INTO table VALUES " + args_str) 

এবং 2 মিনিট এই পদ্ধতিটি ব্যবহার করার সময়:

cur.executemany("INSERT INTO table VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s)", tup)

15
এখনও প্রায় দুই বছর পরে খুব প্রাসঙ্গিক। একটি অভিজ্ঞতা আজ পরামর্শ দেয় যে সারিগুলির সংখ্যা আপনি ধাক্কা দিতে চান, executeকৌশলটি ব্যবহার করা তত ভাল । আমি এটি প্রায় 100x ধন্যবাদ গতিবেগ দেখেছি!
রব ওয়াটস

4
executemanyপ্রতিটি সন্নিবেশের পরে সম্ভবত একটি প্রতিশ্রুতি চালায়। আপনি যদি পরিবর্তে পুরো জিনিসটি কোনও লেনদেনে মুড়ে রাখেন, তবে এটি কি জিনিসগুলিকে ত্বরান্বিত করবে?
রিচার্ড

4
এই উন্নতি নিজেই নিশ্চিত করেছি confirmed আমি সাইকোপজি 2 যা পড়েছি তা থেকে executemanyঅনুকূল কিছু করে না, কেবল লুপ করে এবং অনেক executeবিবৃতি দেয়। এই পদ্ধতিটি ব্যবহার করে, একটি রিমোট সার্ভারে 700 সারি সন্নিবেশ 60 এর দশক থেকে <2s এ চলেছে।
নেলসন

5
হতে পারে আমি +অচল হয়ে পড়েছি , তবে ক্যোয়ারীটিকে এমন একটি স্ক্রোল দিয়ে মনে হচ্ছে এটি স্কিল ইনজেকশন পর্যন্ত খুলতে পারে, আমার কাছে মনে হয় @ ক্লোডাল্ডো নেটো execute_values()সমাধানটি নিরাপদ।
মুন্ন

26
যদি কেউ নিম্নলিখিত ত্রুটির মুখোমুখি হয়: [প্রকারের ত্রুটি: সিকোয়েন্স আইটেম 0: প্রত্যাশিত ত্রুটি উদাহরণ, বাইটস পাওয়া গেছে] পরিবর্তে এই কমান্ডটি চালান [args_str = ','। join (cur.mogrify ("(% s,% s)"), x ) .ডেকোড ("utf-8") এক্স
টুপ

147

সাইকোপগ ২.7 এ নতুন execute_valuesপদ্ধতি :

data = [(1,'x'), (2,'y')]
insert_query = 'insert into t (a, b) values %s'
psycopg2.extras.execute_values (
    cursor, insert_query, data, template=None, page_size=100
)

সাইকোপগ ২.6 এ এটি করার অজগর উপায়:

data = [(1,'x'), (2,'y')]
records_list_template = ','.join(['%s'] * len(data))
insert_query = 'insert into t (a, b) values {}'.format(records_list_template)
cursor.execute(insert_query, data)

ব্যাখ্যা: যদি তথ্য .োকাতে হয় তবে তার মতো তালিকার তালিকা হিসাবে দেওয়া হয়

data = [(1,'x'), (2,'y')]

তবে এটি ইতিমধ্যে যথাযথ প্রয়োজনীয় ফর্ম্যাটে রয়েছে

  1. valuesবাক্য গঠন প্রণালী insertদফা হিসেবে রেকর্ডের একটি তালিকা আশা

    insert into t (a, b) values (1, 'x'),(2, 'y')

  2. Psycopgপাইথনকে tupleপোস্টগ্র্যাস্কল-এ রূপান্তর করে record

সাইকোপগ দ্বারা পূরণ করার জন্য একটি রেকর্ড তালিকার টেম্পলেট সরবরাহ করা একমাত্র প্রয়োজনীয় কাজ

# We use the data list to be sure of the template length
records_list_template = ','.join(['%s'] * len(data))

এবং এটি insertক্যোয়ারিতে রাখুন

insert_query = 'insert into t (a, b) values {}'.format(records_list_template)

insert_queryআউটপুট মুদ্রণ

insert into t (a, b) values %s,%s

এখন সাধারণ Psycopgযুক্তি প্রতিস্থাপন

cursor.execute(insert_query, data)

বা সার্ভারে কী প্রেরণ করা হবে তা কেবল পরীক্ষা করেই

print (cursor.mogrify(insert_query, data).decode('utf8'))

আউটপুট:

insert into t (a, b) values (1, 'x'),(2, 'y')

1
এই পদ্ধতির পারফরম্যান্সটি কীভাবে cur.copy_from এর সাথে তুলনা করে?
মাইকেল গোল্ডস্টেইন

1
এখানে একটি মানদণ্ড সহ একটি সংক্ষিপ্তসার । 10M রেকর্ড সহ আমার মেশিনে copy_from প্রায় 6.5X দ্রুত স্কেল করে।
জোসেফ শেডি

দেখতে দুর্দান্ত লাগছে - আমার মনে হয় আপনার প্রথম সন্নিবেশ_কোরির সংজ্ঞাটি শেষে (যদি আপনি এটিকে একটি টিপল বানানোর চেষ্টা না করতেন)? এবং সন্নিবেশ_কোয়ারির প্রাথমিক সংজ্ঞায়% s এর পরেও অনুপস্থিত রয়েছেন missing
ডেডকোড

2
ব্যবহার করে execute_valuesআমি আমার সিস্টেমটি 1k রেকর্ডে এক মিনিট
128k

66

সাইকোপগ ২. 2. সহ আপডেট করুন:

সর্বোত্তম executemany(): @ ant32 এর বাস্তবায়ন (যাকে বলা হয় "গুটান") এই থ্রেড হিসাবে ব্যাখ্যা চেয়ে 60 গুণ ধীর https://www.postgresql.org/message-id/20170130215151.GA7081%40deb76.aryehleib.com

এই বাস্তবায়নটি 2.7 সংস্করণে সাইকোপজি 2 এ যুক্ত হয়েছিল এবং বলা হয় execute_values():

from psycopg2.extras import execute_values
execute_values(cur,
    "INSERT INTO test (id, v1, v2) VALUES %s",
    [(1, 2, 3), (4, 5, 6), (7, 8, 9)])

পূর্ববর্তী উত্তর:

একাধিক সারি সন্নিবেশ করতে, এর VALUESসাথে মাল্ট্রো সিনট্যাক্স execute()ব্যবহার করা সাইকোপজি 2 ব্যবহারের চেয়ে প্রায় 10x দ্রুত executemany()। প্রকৃতপক্ষে, executemany()কেবলমাত্র বহু ব্যক্তিগত INSERTবিবৃতি চালায় ।

@ অ্যান্ট 32 এর কোডটি পাইথন 2 এ পুরোপুরি কাজ করে But তবে পাইথন 3-এ, cursor.mogrify()বাইটগুলি দেয়, cursor.execute()বাইট বা স্ট্রিংগুলি নেয় এবং উদাহরণটি ','.join()প্রত্যাশা করে str

পাইথন 3 এ আপনাকে যুক্ত করে অ্যান্ট 32 এর কোডটি সংশোধন করতে হবে .decode('utf-8'):

args_str = ','.join(cur.mogrify("(%s,%s,%s,%s,%s,%s,%s,%s,%s)", x).decode('utf-8') for x in tup)
cur.execute("INSERT INTO table VALUES " + args_str)

বা শুধুমাত্র বাইট ব্যবহার করে ( b''বা এর সাথে b""):

args_bytes = b','.join(cur.mogrify("(%s,%s,%s,%s,%s,%s,%s,%s,%s)", x) for x in tup)
cur.execute(b"INSERT INTO table VALUES " + args_bytes) 

26

কার্সর.কপি_ফর্মটি এখন পর্যন্ত বাল্ক সন্নিবেশগুলির জন্য আমি সবচেয়ে দ্রুত সমাধান পেয়েছি। এখানে একটি টুকরোটি আমি তৈরি করেছি যা IteratorFile নামে একটি শ্রেণি রয়েছে যা একটি পুনরুক্তি ফলনকারী স্ট্রিংকে একটি ফাইলের মতো পড়তে দেয়। আমরা জেনারেটর এক্সপ্রেশন ব্যবহার করে প্রতিটি ইনপুট রেকর্ডটিকে স্ট্রিংয়ে রূপান্তর করতে পারি। সুতরাং সমাধান হবে

args = [(1,2), (3,4), (5,6)]
f = IteratorFile(("{}\t{}".format(x[0], x[1]) for x in args))
cursor.copy_from(f, 'table_name', columns=('a', 'b'))

আরোগুলির এই তুচ্ছ আকারের জন্য এটি খুব বেশি গতির পার্থক্য আনবে না, তবে কয়েক হাজার সারি নিয়ে কাজ করার সময় আমি বড় স্পিডআপগুলি দেখি। এটি বিশালাকার ক্যোয়ারী স্ট্রিং তৈরির চেয়ে আরও বেশি মেমরির দক্ষ হবে। একটি পুনরাবৃত্তিকারী কেবল একবারে মেমরিতে একটি ইনপুট রেকর্ড ধারণ করতে পারে, যেখানে আপনার পাইথন প্রসেসে বা ক্যোরি স্ট্রিং তৈরি করে পোস্টগ্রিসে কোনও সময় আপনি মেমরির বাইরে চলে যাবেন।


3
এখানে একটি ক্যোয়ারী বিল্ডার সমাধানের সাথে copy_from / IteratorFile এর সাথে তুলনা করা একটি বেঞ্চমার্ক । 10M রেকর্ড সহ আমার মেশিনে copy_from প্রায় 6.5X দ্রুত স্কেল করে।
জোসেফ শেডি

3
আপনার পালানোর স্ট্রিং এবং টাইমস্ট্যাম্প ইত্যাদির সাহায্যে আশেপাশে ডিক করতে হবে?
সিপিআইএলএল

হ্যাঁ, আপনাকে নিশ্চিত করতে হবে যে আপনার একটি সুগঠিত টিএসভি রেকর্ড রয়েছে।
জোসেফ শেডি

24

Postgresql.org এ সাইক্যাপজি 2 এর টিউটোরিয়াল পৃষ্ঠা থেকে একটি স্নিপেট (নীচে দেখুন) :

একটি শেষ আইটেমটি আমি আপনাকে দেখাতে চাই তা হল কীভাবে অভিধান ব্যবহার করে একাধিক সারি .োকানো যায়। আপনার যদি নিম্নলিখিতগুলি থাকে:

namedict = ({"first_name":"Joshua", "last_name":"Drake"},
            {"first_name":"Steven", "last_name":"Foo"},
            {"first_name":"David", "last_name":"Bar"})

আপনি সহজেই ব্যবহার করে অভিধানের মধ্যে তিনটি সারি সন্নিবেশ করতে পারেন:

cur = conn.cursor()
cur.executemany("""INSERT INTO bar(first_name,last_name) VALUES (%(first_name)s, %(last_name)s)""", namedict)

এটি বেশি কোড সংরক্ষণ করে না, তবে এটি আরও ভাল দেখায়।


35
এটি অনেকগুলি পৃথক INSERTবিবৃতি চালাবে । দরকারী, তবে একক মাল্টি- VALUEডি সন্নিবেশের মতো নয়।
ক্রেগ রিঞ্জার

7

পোস্টগ্র্রেস পরিভাষায় এই সমস্ত কৌশলকে 'এক্সটেন্ডেড সন্নিবেশ "বলা হয় এবং ২ 2016 শে নভেম্বর ২০১ of হিসাবে এটি এখনও সাইকোপিজি 2 এর এক্সিকিউটিম্যানি () এবং এই থ্রেডে তালিকাভুক্ত অন্যান্য সমস্ত পদ্ধতির চেয়ে টন দ্রুত (যা আমি এটিতে আসার আগে চেষ্টা করেছি) উত্তর).

এখানে কিছু কোড যা কার.মোগ্রিফাই ব্যবহার করে না এবং এটি আপনার মাথা পেতে খুব সহজ এবং সহজ:

valueSQL = [ '%s', '%s', '%s', ... ] # as many as you have columns.
sqlrows = []
rowsPerInsert = 3 # more means faster, but with diminishing returns..
for row in getSomeData:
        # row == [1, 'a', 'yolo', ... ]
        sqlrows += row
        if ( len(sqlrows)/len(valueSQL) ) % rowsPerInsert == 0:
                # sqlrows == [ 1, 'a', 'yolo', 2, 'b', 'swag', 3, 'c', 'selfie' ]
                insertSQL = 'INSERT INTO "twitter" VALUES ' + ','.join(['(' + ','.join(valueSQL) + ')']*rowsPerInsert)
                cur.execute(insertSQL, sqlrows)
                con.commit()
                sqlrows = []
insertSQL = 'INSERT INTO "twitter" VALUES ' + ','.join(['(' + ','.join(valueSQL) + ')']*len(sqlrows))
cur.execute(insertSQL, sqlrows)
con.commit()

তবে এটি লক্ষ করা উচিত যে আপনি যদি copy_from () ব্যবহার করতে পারেন তবে আপনার copy_from ব্যবহার করা উচিত;)


মৃতদের থেকে জীবিত হওয়া, তবে শেষ কয়েক সারিটির পরিস্থিতিতে কী ঘটে? আমি ধরে নিলাম আপনি শেষের বাকি সারিতে আবার সেই চূড়ান্ত ধারাটি চালাচ্ছেন, সেক্ষেত্রে আপনার যদি একাধিক সারি রয়েছে?
এমপিপিটারসন

সঠিক, দুঃখিত আমি উদাহরণটি লেখার সময় অবশ্যই তা করতে ভুলে গেছি - আমার সম্পর্কে খুব বোকা। এটি না করার ফলে লোকেদের কোনও ত্রুটি ঘটেনি, যা আমাকে চিন্তায় ফেলেছে যে কতজন লোক समाधान সমাধানের অনুলিপি / পেস্ট করেছে এবং তাদের ব্যবসায়ের বিষয়ে চলেছে ..... যাইহোক, অত্যন্ত কৃতজ্ঞ ম্যাকপেটারসন - আপনাকে ধন্যবাদ!
জেজে

2

আমি উপরে বেশ কয়েক বছর ধরে ant32 এর উত্তর ব্যবহার করছি। তবে আমি খুঁজে পেয়েছি যে পাইথন 3 এ ত্রুটি রয়েছে কারণ এটিmogrify একটি বাইট স্ট্রিং দেয়।

স্পষ্টভাবে বাইটসের স্ট্রিংয়ে রূপান্তর করা কোড পাইথন 3 সামঞ্জস্যপূর্ণ করার জন্য একটি সহজ সমাধান।

args_str = b','.join(cur.mogrify("(%s,%s,%s,%s,%s,%s,%s,%s,%s)", x) for x in tup) 
cur.execute(b"INSERT INTO table VALUES " + args_str)

1

অন্য একটি দুর্দান্ত এবং দক্ষ পদ্ধতির - 1 টি আর্গুমেন্ট হিসাবে সন্নিবেশের জন্য সারিগুলি পাস করা, যা জসন বস্তুর অ্যারে।

যেমন আপনি তর্কটি পাস করছেন:

[ {id: 18, score: 1}, { id: 19, score: 5} ]

এটি অ্যারে, যা ভিতরে কোনও পরিমাণে বস্তু থাকতে পারে। তারপরে আপনার এসকিউএল এর মতো দেখাচ্ছে:

INSERT INTO links (parent_id, child_id, score) 
SELECT 123, (r->>'id')::int, (r->>'score')::int 
FROM unnest($1::json[]) as r 

বিজ্ঞপ্তি: আপনার পোস্টগ্রিসটি জসনকে সমর্থন করার জন্য যথেষ্ট নতুন হতে হবে


1

Cursor.copyfrom সমাধান হিসেবে কর্তৃক প্রদত্ত @ jopseph.sheedy ( https://stackoverflow.com/users/958118/joseph-sheedy ) উপরের ( https://stackoverflow.com/a/30721460/11100064 ) প্রকৃতপক্ষে বাজ দ্রুত।

তবে, তিনি যে উদাহরণটি দিয়েছেন তা কোনও ক্ষেত্রের সংখ্যার সাথে রেকর্ডের জন্য সাধারণভাবে ব্যবহারযোগ্য নয় এবং কীভাবে এটি সঠিকভাবে ব্যবহার করতে হয় তা নির্ধারণ করতে আমার সময় লেগেছিল।

আইট্রেটারফাইলে এই জাতীয় ট্যাব-বিভাজিত ক্ষেত্রগুলি দিয়ে ইনস্ট্যান্ট করা দরকার ( rপ্রতিটি ডিকের রেকর্ড যেখানে ডিক্টের একটি তালিকা):

    f = IteratorFile("{0}\t{1}\t{2}\t{3}\t{4}".format(r["id"],
        r["type"],
        r["item"],
        r["month"],
        r["revenue"]) for r in records)

ক্ষেত্রগুলির একটি স্বেচ্ছাসেবী সংখ্যার জন্য সাধারণকরণের জন্য আমরা প্রথমে সঠিক পরিমাণে ট্যাব এবং ক্ষেত্রের স্থানধারীদের সাথে একটি লাইন স্ট্রিং তৈরি করব: "{}\t{}\t{}....\t{}"এবং তারপরে .format()ক্ষেত্রের মান পূরণ করতে ব্যবহার করব *list(r.values())) for r in records::

        line = "\t".join(["{}"] * len(records[0]))

        f = IteratorFile(line.format(*list(r.values())) for r in records)

এখানে সংক্ষেপে সম্পূর্ণ ফাংশন ।


0

আপনি যদি এসকিউএএলএলকেমি ব্যবহার করছেন তবে আপনার হাতে স্ট্রিংয়ের সাথে জড়িত হওয়ার দরকার নেই কারণ এসকিউএএলএলচেমি একটি একক বিবৃতিটির জন্য একটি বহু-সারি VALUESধারা তৈরি করতে সহায়তা করেINSERT :

rows = []
for i, name in enumerate(rawdata):
    row = {
        'id': i,
        'name': name,
        'valid': True,
    }
    rows.append(row)
if len(rows) > 0:  # INSERT fails if no rows
    insert_query = SQLAlchemyModelName.__table__.insert().values(rows)
    session.execute(insert_query)

হুডের অধীনে এসকিউএলএলচেমি এই জাতীয় কলগুলির জন্য সাইকোপিজি 2 এর এক্সিকিউটিম্যানি () ব্যবহার করে এবং অতএব এই প্রশ্নের বড় প্রশ্নের জন্য তীব্র পারফরম্যান্স সমস্যা থাকবে। এক্সিকিউট পদ্ধতিটি ডকস.সেকলচেমি.আর ./en/latest/orm/session_api.html দেখুন
sage88

2
আমি মনে করি না যে ব্যাপারটি। আমি এটি দেখার পরে এটি কিছুটা হয়েছে, কিন্তু আইআইআরসি, এটি insert_queryলাইনে একটি একক সন্নিবেশ বিবৃতি তৈরি করছে । তারপরে, session.execute()কেবল execute()একক বৃহত্তর স্ট্রিং সহ সাইকোপজি 2-র বিবৃতিটি কল করা হচ্ছে । সুতরাং "কৌশল" সম্পূর্ণ সন্নিবেশ বিবৃতি অবজেক্টটি প্রথমে তৈরি করছে। আমি এটি একবারে 200,000 সারি toোকাতে ব্যবহার করছি এবং সাধারণের তুলনায় এই কোডটি ব্যবহার করে প্রচুর পারফরম্যান্স বৃদ্ধি পেয়েছি executemany()
জেফ উইডম্যান

1
আপনি যে SQLAlchemy ডকটির সাথে লিঙ্ক করেছেন তার একটি বিভাগ রয়েছে যা এটি ঠিক কীভাবে কাজ করে তা দেখায় এবং এমনকি বলে: "একাধিক মান পাস করা traditionalতিহ্যবাহী এক্সিকিউটিম্যানি () ফর্মটি ব্যবহার করার মতো নয়" তা লক্ষ করা জরুরি essential সুতরাং এটি স্পষ্টভাবে কল করছে যে এটি কাজ করে।
জেফ উইডম্যান

1
আমি সংশোধন করেছি. আমি আপনার মানগুলি () পদ্ধতির ব্যবহার লক্ষ্য করিনি (এটি ছাড়া এসকিউএলএলচেমি কেবল এক্সিকিউটম্যানি করে)। আমি বলব যে ডকটির একটি লিঙ্ক অন্তর্ভুক্ত করার জন্য উত্তরটি সম্পাদনা করুন যাতে আমি আমার ভোট পরিবর্তন করতে পারি তবে স্পষ্টতই আপনি এটি ইতিমধ্যে অন্তর্ভুক্ত করেছেন। সম্ভবত উল্লেখ করুন যে ডিক্টের তালিকার সাথে এক্সিকিউট () দিয়ে একটি সন্নিবেশ () সারণি কল করা একই জিনিস নয়?
88ষি 88

এক্সিকিউট_ভ্যালুগুলির তুলনায় এটি কীভাবে সম্পাদন করে?
মিঃআর

0

execute_batch psycopg2 যোগ করা হয়েছে যেহেতু এই প্রশ্ন পোস্ট করা হয়েছে।

এটি এক্সিকিউটিভ_ভ্যালুগুলির চেয়ে ধীর তবে ব্যবহার করা সহজ।


2
অন্যান্য মন্তব্য দেখুন। সাইকোপজি 2 এর পদ্ধতিটি execute_valuesতার চেয়ে দ্রুতexecute_batch
ফায়ার

0

এক্সিকিউটিম্যান টিপলসের অ্যারে গ্রহণ করে

https://www.postgresqltutorial.com/postgresql-python/insert/

    """ array of tuples """
    vendor_list = [(value1,)]

    """ insert multiple vendors into the vendors table  """
    sql = "INSERT INTO vendors(vendor_name) VALUES(%s)"
    conn = None
    try:
        # read database configuration
        params = config()
        # connect to the PostgreSQL database
        conn = psycopg2.connect(**params)
        # create a new cursor
        cur = conn.cursor()
        # execute the INSERT statement
        cur.executemany(sql,vendor_list)
        # commit the changes to the database
        conn.commit()
        # close communication with the database
        cur.close()
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)
    finally:
        if conn is not None:
            conn.close()

-1

আপনি যদি একটি সন্নিবেশকারী স্টেটম্যানের মধ্যে একাধিক সারি সন্নিবেশ করতে চান (ধরে নিই যে আপনি ORM ব্যবহার করছেন না) আমার পক্ষে এখন পর্যন্ত সবচেয়ে সহজ উপায় অভিধানের তালিকাটি ব্যবহার করা হবে। এখানে একটি উদাহরণ:

 t = [{'id':1, 'start_date': '2015-07-19 00:00:00', 'end_date': '2015-07-20 00:00:00', 'campaignid': 6},
      {'id':2, 'start_date': '2015-07-19 00:00:00', 'end_date': '2015-07-20 00:00:00', 'campaignid': 7},
      {'id':3, 'start_date': '2015-07-19 00:00:00', 'end_date': '2015-07-20 00:00:00', 'campaignid': 8}]

conn.execute("insert into campaign_dates
             (id, start_date, end_date, campaignid) 
              values (%(id)s, %(start_date)s, %(end_date)s, %(campaignid)s);",
             t)

আপনি দেখতে পাচ্ছেন কেবল একটি ক্যোয়ারী কার্যকর করা হবে:

INFO sqlalchemy.engine.base.Engine insert into campaign_dates (id, start_date, end_date, campaignid) values (%(id)s, %(start_date)s, %(end_date)s, %(campaignid)s);
INFO sqlalchemy.engine.base.Engine [{'campaignid': 6, 'id': 1, 'end_date': '2015-07-20 00:00:00', 'start_date': '2015-07-19 00:00:00'}, {'campaignid': 7, 'id': 2, 'end_date': '2015-07-20 00:00:00', 'start_date': '2015-07-19 00:00:00'}, {'campaignid': 8, 'id': 3, 'end_date': '2015-07-20 00:00:00', 'start_date': '2015-07-19 00:00:00'}]
INFO sqlalchemy.engine.base.Engine COMMIT

স্কেলচেমি ইঞ্জিন থেকে লগিং প্রদর্শন করা কেবল একটি একক ক্যোয়ারী চালানোর কোনও প্রদর্শন নয়, এর ঠিক অর্থ স্ক্ল্যাচমি ইঞ্জিন একটি কমান্ড চালিয়েছিল। হুডের নীচে এটি সাইকোপজি 2 এর এক্সিকিউটিম্যানি ব্যবহার করছে যা খুব অদক্ষ। এক্সিকিউট পদ্ধতিটি ডকস.সেকলচেমি.আর
sage88

-3

আইওপগ ব্যবহার করে - নীচের স্নিপেট পুরোপুরি সূক্ষ্মভাবে কাজ করে

    # items = [10, 11, 12, 13]
    # group = 1
    tup = [(gid, pid) for pid in items]
    args_str = ",".join([str(s) for s in tup])
    # insert into group values (1, 10), (1, 11), (1, 12), (1, 13)
    yield from cur.execute("INSERT INTO group VALUES " + args_str)


-4

পরিশেষে এসকিউএলএচেমি ১.২ সংস্করণে, এই নতুন বাস্তবায়নটি যখন আপনি ইঞ্জিনটি ব্যবহার_ব্যাচ_মোড = দিয়ে সত্য দিয়ে শুরু করেন তখন এক্সিকিউটিম্যানির পরিবর্তে psycopg2.extras.execute_batch () ব্যবহার করার জন্য যুক্ত করা হয়: সত্য:

engine = create_engine(
    "postgresql+psycopg2://scott:tiger@host/dbname",
    use_batch_mode=True)

http://docs.sqlalchemy.org/en/latest/changelog/migration_12.html#change-4109

তারপরে কাউকে এসকিউএলএলচেমি ব্যবহার করতে হবে স্কয়ার এবং সাইকোপজি 2 এবং সরাসরি এসকিউএল একসাথে বিভিন্ন সংমিশ্রণ চেষ্টা করার বিরক্ত করবেন না ..

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.