คุณจะทำให้ PyPy, Django และ PostgreSQL ทำงานร่วมกันได้อย่างไร?


91

ควรใช้ส้อมหรือชุดรวมกันของแพ็คเกจใดเพื่อให้ PyPy, Django และ PostgreSQL เล่นด้วยกันได้ดี?

ฉันรู้ว่า PyPy และ Django เล่นด้วยกันได้ดี แต่ฉันไม่ค่อยมั่นใจเกี่ยวกับ PyPy และ PostgreSQL ฉันจะดูว่าอเล็กซ์เกย์เนอร์ได้ทำแยกของ PyPy เรียกpypy-PostgreSQL ฉันยังรู้ว่าบางคนกำลังใช้psycopg2-ctypes

มีความแตกต่างระหว่างส้อมเหล่านี้หรือไม่? หรือเราควรใช้ 1.9 PyPy ที่เสถียรแล้วใช้ psycopg2-ctypes? การใช้ตัวเลือก ctypes อาจส่งผลเสียต่อประสิทธิภาพโปรดดูความคิดเห็นด้านล่าง

นอกจากนี้มีใครประสบกับข้อผิดพลาดในการใช้ PyPy กับ pyscopg2 หรือไม่? ดูเหมือนง่ายพอที่จะถอยกลับไปใช้ CPython หากมีบางอย่างไม่ทำงานถูกต้อง แต่ส่วนใหญ่ฉันกำลังมองหาสิ่งที่โปรแกรมเมอร์สามารถทำได้ล่วงหน้าเพื่อเตรียมความพร้อม

ฉันมองไปรอบ ๆ ดูเหมือนว่า psycopg2 จะทำงานร่วมกับ PyPy ไม่ได้ แม้ว่า psycopg2-ctypes ไม่ดูเหมือนจะทำงานสำหรับคนบางคนมีการอภิปรายเกี่ยวกับpypy-dev ฉันทำงานบน Windows และฉันไม่คิดว่า psycopg2-ctypes พร้อมสำหรับ Windows แล้วน่าเศร้า


8
มีการพูดคุยที่ดีของ Alex จาก Djangocon Europe 2011 ซึ่งเขายังพูดถึงประเด็น postgres: blip.tv/djangocon-europe-2011/…
Bernhard Vallant

3
BTW การเรียกรหัส c จาก PyPy ยังช้ากว่าการใช้โมดูล python แท้มาก ดังนั้นคุณอาจไม่ได้รับประโยชน์ใด ๆ จากการเรียกใช้ Django + psycopg2 ผ่าน PyPy คุณสามารถเขียน psycopg2 ในRPythonหรือใช้ CPython และเพิ่มประสิทธิภาพของชิ้นส่วนที่สำคัญของแอพลิเคชันของคุณด้วยCython
Vladimir Protasov

นอกจากนี้: bitbucket.org/alex_gaynor/pypy-postgresql (แบบเก่า ... )
jperelli

2
บางคนรอบตัวแนะนำpsycopg2ctแต่ไม่มี django ... อาจช่วยได้ ...
Dingo

ระบบปฏิบัติการการแจกจ่ายเวอร์ชันของคุณคืออะไร
pylover

คำตอบ:


33

psycopg2cffi (อัปเดต 2015)

psycopg2cffiเป็นอีกหนึ่งตัวทดแทนที่เข้ากันได้กับ Psycopg2 และควรให้ประสิทธิภาพ PostgreSQL ที่ดีที่สุดกับ PyPy เพิ่มสิ่งนี้ให้กับคุณsettings.pyเพื่อให้เข้ากันได้กับทั้งสองอย่าง:

try:
    import psycopg2
except ImportError:
    # Fall back to psycopg2cffi
    from psycopg2cffi import compat
    compat.register()

Psycopg2-ctypes (2012)

ฉันรู้ด้วยว่าบางคนกำลังใช้ Psycopg2-ctypes

นี่เป็นวิธีที่ง่ายที่สุด เพื่อให้เข้ากันได้กับทั้งสองอย่างเพียงเพิ่มรหัสนี้ใน Django ของคุณsettings.py:

try:
    import psycopg2
except ImportError:
    # Fall back to psycopg2-ctypes
    from psycopg2ct import compat
    compat.register()

ฉันได้ทดสอบสิ่งนี้เมื่อไม่กี่รุ่นที่ผ่านมา น่าเศร้าจากประสบการณ์ของฉัน Psycopg2-ctypes ปฏิเสธการเพิ่มประสิทธิภาพเล็กน้อยที่ PyPy จ่าย แต่ YMMV นั้นขึ้นอยู่กับว่าโค้ดของคุณเป็นมิตรกับ JIT โดยทั่วไปและคุณใช้เวลาเพียงเล็กน้อยในการรันโค้ด Python และบางที PyPy อาจจะดีขึ้นตั้งแต่นั้นมา

และฉันไม่คิดว่า psycopg2-ctypes พร้อมสำหรับ Windows แล้ว

ฉันไม่ได้ลองสิ่งนี้ แต่ ctypes ไม่ขึ้นกับแพลตฟอร์ม AFAICT คุณต้องตรวจสอบให้แน่ใจว่าlibpq.dllไลบรารีนั้นโหลดได้ (อยู่ในไดเร็กทอรีในตัวแปรสภาพแวดล้อม PATH หรือไดเร็กทอรีโลคัล) และควรทำงานบน Windows เช่นเดียวกับใน Linux

pypy-postgresql

ฉันเห็นว่า Alex Gaynor ได้สร้างทางแยกของ PyPy ที่เรียกว่า pypy-postgresql

ฉันไม่คิดว่านี่เป็นทางเลือกที่ดีในระยะยาว สาขาไม่ได้รับการอัปเดตมานานกว่าหนึ่งปีแล้วและความพยายามของฉันในการสร้างมันล้มเหลว และดูเหมือนจะผิดในการฮาร์ดโค้ดไดรเวอร์ PostgreSQL ในล่ามอยู่ดี

ฉันเชื่อว่าไม่มีไบนารีจาก pypy-postgresql เช่นกันดังนั้นหากคุณต้องการใช้คุณจะต้องสร้างสาขา PyPy ทั้งหมดด้วยตัวเอง ไม่เหมาะสำหรับคนใจร้อนใช้เวลาหลายสิบนาทีและเครื่องที่มีหน่วยความจำอย่างน้อย 4 GB (คำแนะนำอย่างเป็นทางการ: http://pypy.org/download.html#building-from-source )

ในการสร้างคุณต้องมีแหล่งที่มาก่อน ถ้าคุณมี Mercurial hg clone https://bitbucket.org/alex_gaynor/pypy-postgresqlติดตั้งคุณสามารถเพียง หากไม่เป็นเช่นนั้นคุณสามารถดาวน์โหลดไฟล์ zip "tip" โดยอัตโนมัติ: https://bitbucket.org/alex_gaynor/pypy-postgresql/get/tip.zip

เปิดบรรทัดคำสั่งเข้าไปในไดเร็กทอรีที่คลายการบีบอัดจากนั้นเข้าไปข้างใน pypy/translator/goal

หากคุณติดตั้ง PyPy ขอแนะนำให้ใช้เพื่อสร้าง:

pypy translate.py -Ojit

มิฉะนั้น:

python translate.py -Ojit

น่าเศร้าที่นี่คือจุดที่ความรู้ของฉันสิ้นสุดลง ฉันได้รับข้อผิดพลาด " BytecodeCorruption: unimplemented opcode, ofs=234, code=203, name=BUILD_LIST_FROM_ARG"


คุณช่วยเพิ่มเล็กน้อยให้คุณทราบเกี่ยวกับสิ่งที่อาจต้องใช้เพื่อให้ pypy-pyscopg2 ทำงานร่วมกับ pypy โดยไม่จำเป็นต้องรวบรวม pypy จากแหล่งที่มา
James R

1
ฉันอัปเดตคำตอบพร้อมรายละเอียดว่าฉันไปได้ไกลแค่ไหน น่าเสียดายที่โครงสร้างถูกยกเลิกโดยมีข้อผิดพลาด ฉันจำได้ว่าใช้เวลาทั้งบ่ายเพื่อพยายามสร้างมันเป็นครั้งสุดท้ายและก็ล้มเหลวเช่นกัน
intgr

16

แหล่งข้อมูลเพิ่มเติมบางส่วน:

  • ข้อมูลความเข้ากันได้ของ PyPy: อะแด็ปเตอร์ DB
  • หน้า PostgreSQLบน Python wiki
  • psycopg2cffiโดย Konstantin Lopuhin:
    การใช้งานโดยใช้ cffi ของ psycopg2 สำหรับ PyPy 2.0 และใหม่กว่า
    ( บล็อกโพสต์ , GitHub repo , หน้าPyPI , เธรด pypy-dev )
    - ดูเหมือนว่าเป็นผู้สมัครที่แข็งแกร่งที่สุดในปัจจุบัน แต่ฉันยังไม่ได้ทดสอบ
  • psycopg2ctโดย Michael van Tellingen :
    การใช้งาน ctypes ของ psycopg2 สำหรับ PyPy 1.6 และใหม่กว่า
    ( GitHub repo , หน้า PyPI )
  • pypy-postgresqlโดย Alex Gaynor:
    พอร์ต RPython ที่ถูกทิ้งของ psycopg2 นำไปใช้เป็นส่วนแยกของ PyPy ( Bitbucket repo )
  • pypq :
    "งูใหญ่ PostgreSQL DBAPI 2.0 ขับรถไปตามการใช้ ctypes และ libpq.so ทำงานร่วมกับ PyPy"
    ( การสนทนา , หน้า PyPI )
  • bpgsql :
    ". เล่าเรื่องบริสุทธิ์หลามลูกค้าส่วนใหญ่ PostgreSQL DB-API 2.0 (PEP 249) ตามมาตรฐานรวมถึงการทดลอง Django 1.0 แบ็กเอนด์"
    ( การสนทนา , หน้าเว็บ , Google Code หน้า )
  • pg8000 :
    "a DB-API 2.0 อินเตอร์เฟซที่บริสุทธิ์หลามกับโปรแกรมฐานข้อมูล PostgreSQL [ ... ] ไม่พึ่งพาห้องสมุดภายนอกใด ๆ (เช่นโมดูลรวบรวมหลามหรือห้องสมุด libpq ของ PostgreSQL)"
    ( หน้าเว็บ , GitHub repo , หน้า PyPI )
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.